先说结论,

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)


优游柏树
4 声望0 粉丝