bash的几种特别的I/O重定向语法

下面这几种重定向语法都很简单,容易记住:

ls > stdout.tx											# 用标准输出覆盖stdout.txt
ls not-exist-file 2> stderr.txt							# 用标准错误覆盖stderr.txt
ls exist-file not-exist-file > stdout.txt 2> stderr.txt	# 用标准输出覆盖stdout.txt,用标准错误覆盖stderr.txt
cat < stdin.txt											# 将stdin.txt的内容作为标准输入
														# 这行与cat stdin.txt的效果实际是一样的
echo "1 2 3" | awk '{print NF}'							# 将echo的标准输出重定向为awk的标准输入

但是也有一些特别但又偶尔会用到的语法,不经常用容易忘记,在此记录一下。

将标准输出和标准错误重定向到同一个文件

ls exist-file not-exist-file >stdout.txt 2>&1

需要注意>stdout.txt2>&1的顺序不能颠倒。

也有一种更简单的语法:

ls exist-file not-exist-file &>stdout.txt

将标准输出和标准错误重定向为另一个程序的标准输入

ls exist-file not-exist-file 2>&1 | awk '{print NF}'

将标准错误重定向为另一个程序的标准输入,丢弃标准输出

ls exist-file not-exist-file 2>&1 >/dev/null | awk '{print NF}'

需要注意2>&1>/dev/null顺序不能颠倒。

重定向以另一条命令为参数的命令的标准输出或标准错误

这条听着很拗口,主要指的是time/strace这些命令,如果你直接这样写:

time ls > stdout.txt

那被重定向到stdout.txt的是ls的标准输出而不是time的标准输出。想要重定向time的输出,你得这样:

(time ls) 2> stdout.txt # time输出是输出到stderr的,所以此处用的是2>

Here-document

cat > stdout.txt << EOF
line 0
line 1
line 2
EOF

上面的代码会把“line 0”、“line 1”和“line 2”总共3行文本保存到stdout.txt中(不包括最后的“EOF”)。我第一次见到这种用法是在lfs的文档里,其效果是cat会将后续的输入文本作为标准输入处理,直到遇到一行只包含“EOF”的输入为止。EOF可以替换成其他文本。

使用一连串的echo "line x" >>实际也能达到相同的效果,但是不如这种方式清晰,命令和输入能够分离。


至于其他的重定向语法,还有很多,因为我没有用过,就不在这里列举了,直接man bash然后转到REDIRECTION一节可以得到一个很长的列表与详细解释。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章