标签:
1. 数据流重导向的介绍
谈到数据流重定向,这里需要说明流的概念,就比如说我需要运行一个命令,就可能会有以下流的情况发生:
在运行一个命令时,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。 在上图当中, standard output 与 standard error output 分别代表标准输出与标准错误输出,这两个输出流默认都是输出到屏幕上面的。标准输出指的是命令运行所回传的正确的信息,而标准错误输出可理解为命令运行失败后,所回传的错误信息。
如果我们希望这种输出流可以传送到其他的文件或装置区,那这个时候就使用到了数据流重导向功能;下面是传送所用的特殊字符:
比如:
[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) 若不存在,系统会自动的创建这个文件,但是当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入,也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉。如果想要将数据累加而不想要将旧的数据删除,则可以利用两个大于的符号 (>>) 。
如果想将错误信息忽略掉而不显示或储存,这个时候可以使用黑洞装置 /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 <==或者使用这个特殊符号 &>
standard input( < or << ) 简单说就是将原本需要由键盘输入的数据,改由文件内容来取代。
先看下用 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。 |
Centos6笔记 -- 数据流重导向(Redirection)
标签:
原文地址:http://www.cnblogs.com/wy2185/p/5129437.html