跳到主要内容

11、Linux 教程:bash特性

bash特性

Shell是一种脚本语言,在linux中通过shell控制系统内核,完成内核和硬件的交互。

linux支持的shell在/etc/shells中有描述:

 

一般常用的shell就是bash,它也是linux预设的shell。bash具有很强大的特性,如历史命令、补全功能、设置命令别名、通配符等。

在用户登录时系统就会分配给用户一个shell,这个信息记录在/etc/passwd中:

 

如果系统不想让使用者登入,就可以给该用户分配一个奇怪的shell,这就是/sbin/nologin。

查看指令是否是bash内置命令:type 命令名

历史命令与命令补全

执行history命令就会查看当前计算机执行过的命令。

列出最近的3个命令:history 3

这些历史记录也会被记录在家目录下的.bash_history中,但是只有当关机时才会将命令同步写入文件中(如果同时有多个用户登入,那么最后一个退出的命令会被记录在最后),如果想立即刷新到文件需要执行history -w,如果想清空历史命令记录就执行history -c,但是一般不建议清空历史命令,查看历史命令可以使不同开发成员间熟悉维护的操作。

历史命令默认最多保存1000条,连续重复的命令只会保存一次,这个设置可以在文件/etc/profile中修改。将HISTSIZE=1000修改即可。

使用上箭头或下箭头能直接调出历史命令,执行!数字可以执行对应的历史命令,执行history后每行的数字与命令一一对应,执行!!可以执行上一条命令,执行!ser可以执行最近执行的以ser开头的命令,频繁执行某条命令时很有用。

tab可以补全命令,如果开头的命令不止一个则不会补全,此时按两下tab可以显示开头全部命令,然后再选择即可。

别名与指令搜寻顺序

可以给命令创建别名alias 别名='原命令'然后执行别名就相当于执行原命令。直接执行alias可以查看所有别名的设置。在linux中执行命令的优先级如下:

1第一顺位执行用绝对路径或相对路径执行的命令。
2第二顺位执行别名。
3第三顺位执行Bash的内部命令。
4第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。(linux中的很多命令都是通过环境变量定位到绝对路径然后执行的)

用alias命令设置别名只会暂时生效,想要永久生效需要修改家目录下的.bashrc文件,该文件还存储了变量设置相关内容。删除别名需要执行unalias 别名

别名的主要用途就是把很麻烦的常用命令简单化,还可以设置alias rm = 'rm -i',这样所有的删除操作都必须确认一遍,增加了一定的安全性。

输出重定向与输入重定向、双向重导向

输出重定向就是将本来应该输出在屏幕上的内容输出到文件中,在日志记录中很有用。

输出重定向命令,覆盖模式命令 > 文件,追加模式命令 >> 文件

错误输出重定向,覆盖模式命令 2> 文件,追加模式命令 2>> 文件

这两种命令需要事先确定命令是否正确执行,下一条命令可以直接将正确或错误结果直接写入文件:

覆盖模式命令 &> 文件,追加模式命令 &>> 文件

还可以将输出结果直接输出到dev/null文件,相当于取消输出,在不想显示输出结果时可以用到,如执行命令时在命令后加上空格2>/dev/null,那么错误信息就不会显示在屏幕上了

可以将正确输出和错误输出分别分开输出追加到两个文件中:

命令>>文件1 2>>文件2

输入重定向可以取代键盘的标准输入,如将~/.bashrc的内容重定向到catfile中:

cat > catfile < ~/.bashrc,这样就生成了一个和~/.bashrc相同的文件。

输入重定向一般用来进行统计,wc 文件名就可以统计文件的字节数、单词数、行数。直接执行wc回车再输入内容,最后按ctrl+d,可以统计当前输入内容的字节数、单词数和行数。

双向重导向说的是数据流可以同时输入到文件和屏幕上,将执行结果保留在文件一份,同时输出到屏幕:

ls-l /home | tee ~/homefile | more,tee后跟选项-a可以向文件追加,默认是覆盖。

多命令顺序执行

两条命令用;分隔代表顺序执行两条命令,两条命令是独立状态不会相互影响。用date;命令;date可以测试命令的执行时间。

用&&分隔代表第一条命令顺利执行第二条命令还执行,常用于一系列有顺序需求的命令执行时。$((1&&1))的结果是1,如果有一个不为1结果就是0。

用||分隔代表第一条命令执行失败第二条命令执行,第一条命令执行成功第二条命令不执行,$((0||0))的结果是0,如果有一个不是0结果就是1。

如果/tmp/abc存在就创建/tmp/abc/hehe:ls /tmp/abc && touch /tmp/abc/hehe

如果/tmp/abc不存在就创建该目录:ls /tmp/abc || mkdir /tmp/abc

不清楚/tmp/abc是否存在,但是就是要建立/tmp/abc/hehe:

ls/tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

创造类似三元运算符的指令:命令 && echo yes || echo no表示命令正确执行输出yes,否则输出no。

管道符|

基本格式为命令1 | 命令2,表示命令1正确执行的结果作为命令2的输入。

ll-a /etc/ | more表示用more来查看ll命令输出的结果。

netstat -an | grep "ESTABLISHED"表示在网络信息中提取已连接状态的信息并显示出来,相当于查看有多少远程工具连接到服务器。-an可以显示全部连接,此时tcp连接除了listen状态还有established状态(表示正在连接,打游戏时游戏服务器一定与本机连接,此时查找状态为established的连接就可以找到服务器的ip地址)。

通配符和特殊字符

通配符主要用来匹配文件名。

 

bash中的特殊字符:

 

当内容中有空格时,必须要用引号括起来,单引号会使括起来的内容原封不动的保存,而双引号中有些特殊字符由特殊含义,如$表示调用变量的值,echo "$name"echo '$name'两者的区别是后者会直接打印$name,而前者则会打印name变量真正的值。

转义符也可以让空格变成一般字符:a1=aliba\ ba,这样设置也可以不用加单引号或双引号

反引号``括起来的内容会被识别为系统命令,bash会先执行他,如abc=`date`会把date命令的结果赋值给abc,反括号很容易被看成单引号,所以$()用的更多一些,这两个符号用法相同。示例:

cd/lib/modules/$(uname -r)/kernel

一般把一个常用目录路径定义成变量,每次登入时就可以轻松进入该目录:cd $workdir,变量相关设置在家目录下的.bashrc文件中可以设置。

欢迎提示信息

登录后的欢迎/提示信息文件:/etc/issue(本地登录)、/etc/issue.net(远程登录)、/etc/motd(两种登录都生效)。一般会把大家都关注的信息放到里面,如维护时间等。

想要编辑自己的欢迎信息必须明确该文件中各代码的含义:

 

登录后提示字符root为#,一般用户未$。退出登录为exit。