27/04: I/O Redirection(标准输入/输出重定向) in bash
bash里的I/O重定向是很奇妙的事情,一般常用的有>, >>, 2>&1, &>, | 等常用重定向技巧。还有一些很高级的重定向技巧,比如Advanced Bash-Scripting Guide里的Chapter 16. I/O Redirection或者是这篇I/O重定向 详解及例子里介绍的高级技巧,我看了后简直要晕掉。
而且,一直没搞明白下面两个命令为什么会有不同?(本例来自于上面提到的ABSG,印象里某公司的笔试题里有让你指出其差别):
ls -yz >> command.log 2>&1 ls -yz 2>&1 >> command.log
xargs和tee也是和重定向密切相关的两个shell命令。
xargs的官方解释是"build and execute command lines from standard input",理解起来比较绕。我举个例子,假设当前目录有个文件 aaa,其中内容为"this is aaa",执行命令
find . -name "aaa" 2>/dev/null | cat
的结果为
./aaa
而执行命令
find . -name "aaa" 2>/dev/null | xargs cat
的结果为
this is aaa
本例可以解释为,前者只是把管道之前的命令的标准输出作为后者的标准输入,而xargs是把管道之前的命令的标准输出的内容逐行作为参数和xargs之后的命令一起组装成一条条完整的执行语句。
当你希望把标准输出重定向到文件,而又同时能在终端上看到屏幕输出时,tee可以发挥作用了。比如
cat aaa | tee afile和cat aaa > afile两个命令得到的afile是一样的,不过前一命令能同时在终端看到aaa这个文件的内容。
最后,提一下script这个命令。从键入script开始,你的所有终端显示内容将被输入到一个文件里(默认为typescript),直至exit或者Ctrl+D退出script环境。这在希望记录大段输入以及输出内容时很有用。
asdf wrote:
1st command redirects error messages to command.log, but the 2nd not (still in screen)