输入输出重定向
输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。
对于输入重定向来讲,用到的符号及其作用如表3-1所示。
表3-1 输入重定向中用到的符号及其作用
符号 | 作用 |
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
对于输出重定向来讲,用到的符号及其作用如表3-2所示。
表3-2 输出重定向中用到的符号及其作用
符号 | 作用 |
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 |
将标准输出与错误输出共同写入到文件中(追加到原有内容的后面 |
同标准I/O一样,Shell对弈每一个进程预先定义3个文件描述字(0、1、2),分别对应于:
0 (STDIN)标准输入;
1 (STDOUT)标准输出;
2 (STDERR)标准错误输出。
>或者>> 输出重定向,例子:ls -l /tmp > /tmp.msg,date >> /tmp.msg
>表示覆盖,>>表示追加;
< 输入重定向,例子:wall < /etc/motd
2> 错误输出重定向,例子:cp -R /usr/backup/usr.bak 2> /bak.error
---------------------------------------------------------------------------------------
管道
管道:将一个命令的输出传送给另一个命令,作为另一个命令的输入。
使用方法:命令1|命令2|命令3|...|命令n
例子: ls -l /etc | more
ls -l /etc | grep init | wc -l,统计etc下init有多少行
命令连接符
;用;间隔的各个命令按顺序依次执行。
&&,前后命令执行存在逻辑关系,前一个命令执行成功,后面的命令才可以执行
||,前后命令执行存在逻辑关系,前一个命令执行成功,后面的命令不执行,前一个命令执行失败,后面的命令才可以执行。
命令替换符
命令替换:将一个命令的输出作为另一个命令的参数。
格式为:命令1 ·命令2·,例子:ls -l ·which touch·
常用的转义符号
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(''):转义其中所有的变量为单纯的字符串。
双引号(""):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
[root@localhost ~]# PRICE=5 [root@localhost ~]# echo "Price is $PRICE" Price is 5
接下来,我们希望能够输出“Price is $5”,即价格是5美元的字符串内容,但碰巧美元符号与变量提取符号合并后的$$作用是显示当前程序的进程ID号码,于是命令执行后输出的内容并不是我们所预期的:
[root@localhost ~]# echo "Price is $$PRICE" Price is 3767PRICE
要想让第一个“$”乖乖地作为美元符号,那么就需要使用反斜杠(\)来进行转义,将这个命令提取符转义成单纯的文本,去除其特殊功能。
[root@localhost ~]# echo "Price is \$$PRICE" Price is $5
而如果只需要某个命令的输出值时,可以像`命令`这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与uname -a命令结合,然后使用echo命令来查看本机的Linux版本和内核信息:
[root@localhost~]# echo `uname -a` VM_16_3_centos 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux比较经典的问题:“为什么不能将当前目录(.)添加到PATH中呢? ” 原因是,尽管可以将当前目录(.)添加到PATH变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp中存放了一个与ls或cd命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。