Linux基础_Bash特性

Tab补全

命令补全

shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令。而在很多情况下,我们对某些命令可能会记得不牢固,从而敲错,这个时候就可以用上bash的命令补全机制了。

命令查找机制:

  • 查找内部命令
  • 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名

 

  • 给定的起始字符串如果能惟一标识某命令程序文件,则直接补全。
  • 不能惟一标识某命令程序文件,再击tab键一次,则会给出列表。

路径补全

在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件
tab:如果能惟一标识,则直接补全,否则,再一次tab,给出列表。

命令行展开

命令行展开也为bash的一大特性,即使用带~和{}

  • ~:自动展开为用户的家目录,或指定的用户的家目录
  • {}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径。

例如1:

mkdir -pv /tmp/test/{a,b{x,y}}

例如2:

mkdir -pv /tmp/test/{a,b,{x,y}}

命令的执行状态结果

Linux的命令执行,无非两种结果,即成功或者失败,而在bash里会用返回值0-255来标识命令的执行状态。

0:成功

1-255:失败

在命令执行完成之后,其状态返回值保存于bash的特殊变量$?中。

例如:

pwd
echo $?

pwa
echo $?

快捷键

  • Ctrl+a:跳转至命令行行首
  • Ctrl+e:跳转至命令行行尾
  • Ctrl+u:删除行首至光标所在处之间的所有字符
  • Ctrl+k:删除光标所在处至行尾的所有字符
  • Ctrl+l:清屏,相当于clear

命令行历史

shell进程会在其会话中保存此前用户提交执行过的命令。而命令历史主要使用命令history来实现。

命令用法:
history

  • -c: 清空命令历史
  • -d :删除指定命令历史
  • -r: 从文件读取命令历史至历史列表中
  • -w:把历史列表中的命令追加至历史文件中
  • history #:显示最近的#条命令

日常使用:

  • !#:再一次执行历史列表中的第#条命
  • !!:再一次执行上一条命令
  • !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令
  • 调用上一条命令的最后一个参数
  • 快捷键:ESC, .
  • 字符串:!$

我们还可以通过修改环境变量来定制history命令的一些功能

  • HISTSIZE:指定shell进程可保留的命令历史的条数
  • HISTFILE:指定持久保存命令历史的文件.bash_history
  • HISTFILESIZE:指定命令历史文件的大小

同时我们也可以改变命令历史记录的方式:通过修改环境变量HISTCONTROL的值即可实现

  • ignoredups:忽略重复的命令(默认)
  • ignorespace:忽略以空白字符开头的命令
  • ignoreboth:以上两者同时生效

 

命令别名(alias)

命令别名即可以在bash中为我们经常使用的一些命令定义某个简短的命令,从而增加工作效率,比如我们要打开网卡文件,即可以将vim /etc/sysconfig/network...等一大串的命令即参数直接定义为vimnet即可。这样会方便管理惭怍,除此之外,linux自身也会自带一些命令别名。

 alias
显示当前shell进程所有可用的命令别名;
alias NAME='VALUE'
定义别名NAME,其相当于执行命令VALUE

alias

alias vimnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'##相当于以后想要配置网卡eth0直接输入命令vimnet就可以了

注意:在命令行中定义的别名,仅对当前shell进程有效;如果想永久有效,要定义在配置文件中

  • 仅对当前用户:~/.bashrc
  • 对所有用户有效:/etc/bashrc

注意:编辑配置给出的新配置不会立即生效想要立即生效需要让bash进程重新读取配置文件:

source /path/to/config_file. /path/to/config_file

撤消别名:unalias
unalias [-a] name [name ...]

注意: 如果别名同原命令的名称,则如果要执行原命令,可使用"\COMMAND"

 

文件名通配(globbing)

 

globbing:文件名通配(整体文件名匹配,而非部分)

匹配模式:元字符

  • *:匹配任意长度的任意字符
  • ?:匹配任意单个字符
  • []:匹配指定范围内的任意单个字符
  •   有几种特殊格式:

    [a-z], [A-Z], [0-9], [a-z0-9]
    [[:upper:]]:所有大写字母
    [[:lower:]]:所有小写字母
    [[:alpha:]]:所有字母
    [[:digit:]]:所有数字
    [[:alnum:]]:所有的字母和数字
    [[:space:]]:所有空白字符
    [[:punct:]]:所有标点符号

 

  • [^]:匹配指定范围外的任意单个字符

    [^[:upper:]]
    [^0-9]
    [^[:alnum:]]

例如:

1:显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录

ls -d /var/l?[[:lower:]]

2:显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录

ls -d /etc/[0-9]*[^0-9]

3:显示/etc目录下,以非字母开头,后面跟一个字母及其它任意长度任意字符的文件或目录

ls -d /etc/[^[:alpha:]][[:alpha:]]*
ls -d /etc/[^a-z][a-z]*

4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/etc目录

cp -r /etc/m*[^0-9] /tmp/etc/

5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下

cp -r usr/share/man/man[0-9] /tmp/man/

6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下

 cp -r /etc/[mnrp]*.conf /tmp/conf.d/

猜你喜欢

转载自www.cnblogs.com/fudelike/p/10994063.html