鸟哥的Linux私房菜读书笔记---数据流重导向

1、数据流导向

数据流导向就是将某个执行后应该 要出现在屏幕上的数据传输到其它地方。

鸟哥的Linux私房菜读书笔记---数据流重导向

<1>standard output与standard error output

        标准输出指的是指令执行所回传的正确信息,而标准错误输出是指。指令执行失败后,所传回的错误信息不管正确或错误的数据都是默认输出到屏幕上,所以屏幕是乱乱的!是否透过某些机制将这两股数据分开呢? 数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:
        1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
        2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
        3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
    范例一:观察你的系统根目录 (/) 下各目录的文件名、权限与属性,并记录下来
        [[email protected] ~]$ ll /                          <==此时屏幕会显示出文件名信息
        [[email protected] ~]$ ll / > ~/rootfile        <==屏幕并无任何信息                                                                                                      [[email protected] ~]$ ll ~/rootfile             <==有个新档被建立了!
            -rw-rw-r--. 1 dmtsai dmtsai 1078 Jul 9 18:51 /home/dmtsai/rootfile                                                                                      怪了!屏幕怎么会完全没有数据呢?这是因为原本『 ll / 』所显示的数据已经被重新导向到 ~/rootfile 文件中了! 那个 ~/rootfile 的档名可以随便取。如果你下达『 cat ~/rootfile 』那就可以看到原本应该在屏幕上面的数据啰。 如果我再次下达:『 ll /home > ~/rootfile 』后,那个 ~/rootfile 文件的内容变成什么? 他将变成『仅有 ll /home 的数据』而已!咦!原本的『 ll / 』数据就不见了吗?是的!因为该文件的建立方式是:
        1. 该文件 (本例中是 ~/rootfile) 若不存在,系统会自动的将他建立起来,但是
        2. 当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入!
        3. 也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉啰!                                                                              如果只是进行数据的累加则可以使用>>。

对于standard error output:    数字与导向箭头间没有空格         

    · 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
    · 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
    · 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
    · 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;

在一行命令中可以分别将正确信息与错误信息输出到对应的文件中:

命令:$ 指令   >  文件1    2>   文件2    ##正确信息以覆盖的方法输出到文件1中,错误信息由覆盖的方法输出到文件2中

<2>/dev/null 垃圾桶黑洞装置与特殊写法

        当我们知道错误信息发生时,我们需要将错误信息忽略不显示或者不存储,黑洞装置/dev/null可以吃掉任何导向该装置的信息当需要对两股数据写入同一文件时,可以使用特殊语法或

命令:$  指令   >  文件名    2>&1     或     命令:$  指令   &>文件名

<3>standard input

标准输入指的是将原本需要由键盘输入的数据改由文件内容来取代

    范例七:用 stdin 取代键盘的输入以建立新文件的简单流程
        [[email protected] ~]$ cat > catfile < ~/.bashrc
        [[email protected] ~]$ ll catfile ~/.bashrc
            -rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 /home/dmtsai/.bashrc
            -rw-rw-r--. 1 dmtsai dmtsai 231 Jul 9 18:58 catfile
        # 注意看,这两个文件的大小会一模一样!几乎像是使用 cp 来复制一般!

为什么需要使用命令输出重导向呢?

        · 屏幕输出的信息很重要,而且我们需要将他存下来的时候;
        · 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
        · 一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的执行结果,希望他可以存下来时;
        · 一些执行命令的可能已知错误讯息时,想以『 2> /dev/null 』将他丢掉时;
        · 错误讯息与正确讯息需要分别输出时。

2、命令执行的判断依据

<1>cmd  ;cmd(不考虑指令相关性的连续指令下达)

命令:$ 指令1;指令2;指令3

<3>$?(指令回传值)与  &&  或  ||

若前一个指令执行的结果为正确,在Linux底下会互传一个$?=0的值。我们可以通过回传值来判断后续指令是否执行

指令下达情况  说明
cmd1 && cmd2 1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。
2. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。
cmd1 || cmd2 1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。
2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。

鸟哥的Linux私房菜读书笔记---数据流重导向

假设判断式:cdm1  &&  cmd2  ||  cmd3    ##如果cmd1执行正确,cmd2执行正确则停止,若cmd2执行错误,则执行cmd3

由此,指令是一条接着一条去执行的。