常用的文件描述符
/dev/stdin: 0
/dev/stdout: 1
/dev/stderr: 2
/dev/null: 黑洞
常用的操作
command > filename
# 重定向到某个文件, 如果文件已经存在则删除该文件,
# 文件不存在会新建, 因此命令成功与否原文件内容都会丢失
command >> filename
# 同 > 相似, 只不过是追加到文件末尾
command 1> filename (简写为 >)
# stdout重定向
command 2> filename
# stderr重定向
M > N
# 重定向 M 到 N
# M 是一个文件描述符, 默认为 1 (stdout)
# N 是一个文件描述符
M >& N
# M 合并到 N
# M 是一个文件描述符, 默认为 1 (stdout)
# N 是一个文件描述符
M >& N (zsh下无效, 原因不明)
同
M &> N
# `>&` 或者 `&>` 是一个整体符号, 不要看成 `>` 和 `&`
常见用法
command > filename
等于
command 1> filename
# 重定向stdout覆盖到filename
command >> filename
等于
command 1>> filename
# 重定向stdout追加到filename
commamd 2> filename
# 重定向stderr覆盖到filename
command 2>> filename
# 重定向stderr追加到filename
command &> filename
# 重定向stdout和stderr覆盖到filename
注意
如果一行命令stdout和stderr都不为空,
那么stderr的内容在stdout的内容的前面
ls > out.txt 2>&1 (1)
不等同于
ls 2>&1 >out.txt (2)
(1) stdout重定向到out.txt,然后stderr重定向到stdout(现在是out.txt)
(2)stderr重定向到stdout, 这时会产生一个stdout的拷贝,
作为程序的stderr, 然后原来的stdout重定向到out.txt,
拷贝的stdout没有作用, 结果是stderr没了, 原来的
stdout重定向到文件中去了
参考
http://www.runoob.com/linux/linux-shell-io-redirections.html
https://blog.csdn.net/win_turn/article/details/50379465
https://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html