Centos6笔记 -- 数据流重导向(Redirection)

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 <==或者使用这个特殊符号 &>

  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。

原文地址:https://www.cnblogs.com/wy2185/p/5129437.html