先说结论,
2>&1 的意思是,把标准错误 (stderr) 重定向到标准输出(stdout)
如果想了解为什么,可以继续阅读:
1 和 2 是什么
shell 中,有一些常用的文件描述符(file descriptor):
0: 标准输入(stdin) 1: 标准输出(stdout) 2: 标准错误(stderr)
所以 2>&1 中的 2 就是标准错误,1 就是标准输出。
> 符号是什么
“>” 是 shell 中的重定向符,例如:echo “abc” > file1 就是把 abc 写到文件名交 file1 的文件中。其中要注意的是,一般 ”1>” 可以简写成 ”>”,也就是默认重定向是重定向标准输出。标准输入重定向用 ”<“,标准错误重定向用 ”2>”,这样三个标准文件描述符都能正确的区分重定向了。
& 是什么
& 符号在 shell 中有几个意思,在 2 >&1 中,& 用做一个“转义符”,和 1 结合,”&1″ 一起表示标准输出。那为什么需要 & 呢?1 不是已经表示标准输出了吗?那我们假设我们用这样 shell script:
cat file1 > outfile 2>1
那这样,系统就会认为,把标准错误输出到文件名是 1 的文件中。为了消除歧义,&1 在这个情景下,才表示标准输出,否则单独的 1,就是文件名为 1 的文件。如果你看到一个 script 是:
cat file1 > outfile 2>&1 &
第二个 &(command 最后的 &),表示 command 在后台运行,意义与 &1 中的 & 不同。
这条命令背后是什么
如果想深入了解一下,可以继续阅读:这个命令其实是一个 dup2()调用。dup2 的作用是复制一个现存的文件描述符。
dup2 可以用 newfd 参数指定新描述符的数值,如果 newfd 已经打开,则先将其关闭。如果 newfd 等于 oldfd,则 dup2 返回 newfd, 而不关闭它。dup2 函数返回的新文件描述符同样与参数 oldfd 共享同一文件表项。
dup2 等效于:
close(oldfd);fcntl(oldfd, F_DUPFD, newfd);
用 strace 可以看到,command > file 2>&1 这个命令中实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)
参考文献
linux 之 dup 和 dup2 函数解析 linux shell 中 ”2>&1″ 含义 shell 重定向输出(1>&2 2>&1 &>file >&file)