【鸟哥的linux私房菜-学习笔记】Bash shell之数据流重导向

数据流重导向 (Redirection)

数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)。

标准输出指的是『命令运行所回传的正确的信息』,而标准错误输出可理解为『 命令运行失败后,所回传的错误信息』。这两个默认都是输出到屏幕上面来的。

数据流重导向可以将 standard output (简称 stdout) 与 standard error output (简称 stderr) 分别传送到其他的文件或装置去,而分别传送所用的特殊字符则如下所示:

标准输入  (stdin) :代码为 0 ,使用 < 或 << ;
标准输出  (stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

例子:

ll / > ~/rootfile

将标准输出重导向到~/rootfile文件中。

该文件的创建方式是:

该文件 (本例中是 ~/rootfile) 若不存在,系统会自动的将他创建起来;
当文件存在时,系统会先将这个文件内容清空,然后再将数据写入;
也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉。

如果想将数据累加而不想将旧的数据删除,可利用两个大于的符号 (>>) 。以上面的范例来说,应该要改成『 ll / >> ~/rootfile 』。 如此一来,当 (1) ~/rootfile 不存在时系统会主动创建这个文件;(2)若该文件已存在, 则数据会在该文件的最下方累加进去。

综合例子:

将 stdout 与 stderr 分存到不同的文件去:
find /home -name .bashrc > list_right 2> list_error

/dev/null 垃圾桶黑洞装置

如果想要将错误信息忽略掉而不显示或储存,可以使用黑洞装置 /dev/null。这个 /dev/null 可以吃掉任何导向这个装置的信息。

特殊写法

如果要将正确与错误数据通通写入同一个文件去,那么需要使用特殊写法:

find /home -name .bashrc > list 2>&1

或者:

find /home -name .bashrc &> list

为什么不能用find /home -name .bashrc > list 2> list呢?
因为这样写两股数据可能会交叉写入该文件内,造成次序的错乱。

standard input : < 与 <<

< :将原本需要由键盘输入的数据,改由文件内容来取代。
<<:代表『结束的输入字符』。

例子:
用 cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束:

cat > catfile << "eof"

命令运行的判断依据: ; , &&, ||

不考虑命令相关性的连续命令下达:

cmd ; cmd

命令存在相关性:
$? (命令回传值),与 &&, 或 ||

若前一个命令运行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值

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

例子:

ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe

讨论如下:
(1)若 /tmp/abc 不存在故回传 $?≠0,则 (2)因为 || 遇到非为 0 的 $? 故开始 mkdir /tmp/abc,由于 mkdir /tmp/abc 会成功进行,所以回传 $?=0 (3)因为 && 遇到 $?=0 故会运行 touch /tmp/abc/hehe,最终 hehe 就被创建了;

(1)若 /tmp/abc 存在故回传 $?=0,则 (2)因为 || 遇到 0 的 $? 不会进行,此时 $?=0 继续向后传,故 (3)因为 && 遇到 $?=0 就开始创建 /tmp/abc/hehe 了!最终 /tmp/abc/hehe 被创建起来。

你可能感兴趣的:(linux,shell,bash,数据流重导向)