下面这几种重定向语法都很简单,容易记住:
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.txt
和2>&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
一节可以得到一个很长的列表与详细解释。