1. 数据流重导向的介绍
谈到数据流重定向,这里需要说明流的概念,就比如说我需要运行一个命令,就可能会有以下流的情况发生:
在运行一个命令时,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。 在上图当中, standard output 与 standard error output 分别代表标准输出与标准错误输出,这两个输出流默认都是输出到屏幕上面的。标准输出指的是命令运行所回传的正确的信息,而标准错误输出可理解为命令运行失败后,所回传的错误信息。
如果我们希望这种输出流可以传送到其他的文件或装置区,那这个时候就使用到了数据流重导向功能;下面是传送所用的特殊字符:
- 标准输入 (stdin) :代码为 0 ,使用 < 或 <<
- 标准输出 (stdout):代码为 1 ,使用 > 或 >>
- 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>
比如:
[root@www ~]# ll / <==此时屏幕会显示出文件名信息
[root@www ~]# ll / > ~/rootfile <==屏幕并无任何信息
[root@www ~]# ll ~/rootfile <==有个新档被创建,数据重新导向到了这个文件中
-rw-r--r-- 1 root root 1089 Feb 6 17:00 /root/rootfile
如果我又再次运行命令 ll /home > ~/rootfile ,那么上例中创建的rootfile中的内容会被覆盖掉,这里面文件的创建是有一定规则的:该文件 (本例中是 ~/rootfile) 若不存在,系统会自动的创建这个文件,但是当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入,也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉。如果想要将数据累加而不想要将旧的数据删除,则可以利用两个大于的符号 (>>) 。
- 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
- 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
- 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
- 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;
如果想将错误信息忽略掉而不显示或储存,这个时候可以使用黑洞装置 /dev/null 。这个 /dev/null 可以吃掉任何导向这个装置的信息。比如:
将错误的数据丢弃,屏幕上显示正确的数据
[dmtsai@www ~]$ find /home -name .bashrc 2> /dev/null
/home/dmtsai/.bashrc <==只有 stdout 会显示到屏幕上, stderr 被丢弃了
如果要将正确与错误数据通通写入同一个文件,这个时候就得要使用特殊的写法:
[dmtsai@www ~]$ find /home -name .bashrc > list 2>&1 <==使用特殊符号 2>&1
[dmtsai@www ~]$ find /home -name .bashrc &> list <==或者使用这个特殊符号 &>
将原本需要由键盘输入的数据,改由文件内容来取代。
先看下用 cat 命令操作来了解一下什么叫做键盘输入:
[root@www ~]# cat > catfile
testing
cat file test
<==这里按下 [ctrl]+d 来离开
[root@www ~]# cat catfile
testing
cat file test
我们再来看一下用某个文件的内容来取代键盘的输入:
[root@www ~]# cat > catfile < ~/.bashrc
[root@www ~]# ll catfile ~/.bashrc
-rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc
-rw-r--r-- 1 root root 194 Feb 6 18:29 catfile
我们再来理解一下 << 这个连续两个小于号的意思, 它代表的是结束的输入字符的意思。举例来讲:我要用 cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束,那我可以这样做:
[root@www ~]# cat > catfile << "eof"
> This is a test.
> OK now stop
> eof <==输入这关键词,立刻就结束而不需要输入 [ctrl]+d
[root@www ~]# cat catfile
This is a test.
OK now stop <==只有这两行,不会存在关键词那一行!
2. 命令运行的判断依据: ; , &&, ||
在某些情况下,很多命令想要一次输入去运行,而不想要分次运行时,基本上我们有两个选择, 一个是 shell script 撰写脚本去运行,一种则是透过底下介绍的。
2.1 cmd ; cmd (不考虑命令相关性的连续命令下达)
在命令与命令中间利用分号 (;) 来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令。这种运行命令的方式不管前一个命令是否正确运行了,后一个命令也会被执行的。
2.2 $? (命令回传值) 与 && 或 ||
若前一个命令运行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值。我们可以使用 && 及 || 来通过命令回传值来判断后续的命令是否需要执行。
命令下达情况 | 说明 |
cmd1 && cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。 |
cmd1 || cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。 |