Linux命令行基础,关于Bash需要知道的一些常识

介绍linux越来越重要,对于开发者来说学习必要的bash技术必不可少,对运维来说更是如此 。学习shell可以参考很多学习材料和图书,比如ChinaUnix论坛网中人大哥总结的《Shell十三问》的帖子,《ABS 指导》(《Advanced Bash-Scripting Guide》),《linux shell脚本攻略》等大家可以参考 。本文虫虫给大家一些常用的shell技巧分享给大家,希望可以对大家有所帮助 。

Linux命令行基础,关于Bash需要知道的一些常识

文章插图
 
引导顺序首先我们要说下bash脚本的启动,Linux中系统初始化都是按照一定顺序加载各个文件初始化脚本(Shell脚本) 。脚本所在文件启动顺序很重要,下面这个图显示了Linux系统个初始化脚本和环境变量的加载顺序,包括了bash、sh和zsh等常见的shell 。
Linux命令行基础,关于Bash需要知道的一些常识

文章插图
 
bash的加载遵循上图,从上到下顺序执行加载,尤其要注意non-login、非交互(上面蓝色线)执行,它不会加载很多脚本,比如/etc/profile(总profile),/etc/bash.bashrc(总basrc),和个人的.profile, .bash_profie,.bash_login和.bashrc等 。所以如果你脚本处于这样环境下(比如cron脚本),你就要在脚本中自我设置一些环境变量 。这样就可以避免由于环境变量导致的一些莫名其妙的的问题,比如写的好脚本为什么登陆就可以执行,放到cron里面自动执行就不行 。
输入/输出和重定向【Linux命令行基础,关于Bash需要知道的一些常识】我们知道Linux下一切皆文件,包括硬件设备,其中三个特殊的文件句斌,标准输入(stdin)、标准输出(stdout)和标准错误(stderr),其句柄号为三个整数0,1和2 。
< :用于重定向改变标准输入(stdin) 。
0< :0< 和<一样,<符号之前需要制定一个FD,默认为0 。
<< :输入一段文本,直到读到<<后指定的内容,这就是常说的heredoc 。
> :用于重定向改变标准输出(stdout) 。
1> :1> 和>一样,> 默认的FD为1 。
2> :改变标准错误(stderr) 。
>> :重定向输出到文件,追加到文件末尾 。
set -o noclobber :设置 > 不能覆盖已经存在的文件 。
set +o noclobber :这支 > 可以覆盖已经存在的文件 。
>| :设置set -o noclobber后,使用 >| 可以临时覆盖已经存在的文件 。
/dev/null 和 /dev/zero这两个文件是两个比较特殊设备 。/dev/null,或称空设备,它会丢弃一切写入它的数据,但是读取它则会抛出错误 。在shell中常用它来表示放弃执行的结果(或者错误),这样只关注于程序执行,比如在cron中的任务,输出和错误都没有意义 。
command > /dev/null
可以将stdout、stderr都重定向输出到/dev/null:
command > /dev/null 2>&1 或者
command &> /dev/null
command >& /dev/null
/dev/zero 设备用于提供无限制的空null内供读取 。当读取该设备(文件)时候,它会提供无限的空字符 null 。我们可以从/dev/zero 读取任意数量的 null 字符 。和 /dev/null 不同,/dev/zero主要用于作为null数据源供读取,当然/dev/zero也支持写入,可以用做数据黑洞,。
/dev/zero主要用途是提供字符流来初始化数据存储,也就是使用空字符覆盖目标数据 。还可以用来一个特定大小的空白文件 。
比如用空白文件覆盖分区,删除分区的数据可以用(慎用!):
dd if=/dev/zero of=/dev/<destination partition>
创建一个一个1M的文件,可以使用
dd if=/dev/zero of=cc count=1024 bs=1024
``和$()反引号(Tab键上面的键)和$(),两者基本上类似,在shell中都表示执行命令 。
echo`ls`
echo $(ls)
最常用的用法是将一些命令结果输出传递个其他命令作为参数 。比如要查询当前目录和子目录下所有php中的包含"eval"函数(似疑木马),可以用下面命令:
grep eval `find -type f -name "*.php"`
两者主要的区别在于嵌套更简单 。
对``来说要实现嵌套就要增加很多反斜杠来转义,比如:
echo `echo `echo \`echo hello,Chongchong!\```
而用$()就简介的多了:
echo $(echo $(echo $(echo hello,Chongchong!)))
<()这是个很有意义的操作符,他有点类似于$(),而对括弧中命令的输出重用 。但是在<上下文中其输出结果被会视为文件,可以用于以文件名为参数的命令中 。
比如我们要执行下面一些例子
grep keys file1> /tmp/a
grep keys file2> /tmp/b
diff /tmp/a /tmp/b


推荐阅读