鸟哥的Linux私房菜读书笔记---数据流重导向
1、数据流导向
数据流导向就是将某个执行后应该 要出现在屏幕上的数据传输到其它地方。
<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。 |
假设判断式:cdm1 && cmd2 || cmd3 ##如果cmd1执行正确,cmd2执行正确则停止,若cmd2执行错误,则执行cmd3
由此,指令是一条接着一条去执行的。