Bourne shell中"2 <&1"重定向有什么作用?

DVK*_*DVK 10 bash shell redirect sh

2>&1 Bourne shell中的重定向将输出发送到文件描述符2(默认情况下为标准错误),并将其发送到文件描述符1(默认为标准输出).

2<&1重定向是做什么的?

它会将stderr发送给stdin吗?

我的理论是它将stdin发送到stderr(例如同样1>&2),但实验上,情况并非如此:

$ perl -e 'print "OUT\n"; print STDERR "ERR\n"; \
  while (<>) { print "IN WAS $_\n";}'           \
  > out3 2<&1
df
$ cat out3
ERR
OUT
IN WAS df
Run Code Online (Sandbox Code Playgroud)

请注意,标准输出AND标准错误都转到文件out3,其中重定向了stdout.

rob*_*off 6

<&经营者复制"输入"文件描述符.根据IEEE Std 1003.1-2001(也称为单一Unix规范v3,POSIX的后继者),2<&1如果1不是打开输入的文件描述符,则应该是一个错误.但是,它似乎bash是惰性的,并不关心文件描述符是打开输入还是输出.

因此2<&1,2>&1只需执行系统调用dup2(1, 2),即将文件描述符1复制到文件描述符2.

您可以通过运行这样的命令来检查,因为重定向是从左到右执行的:

sleep 99999 1>/dev/null 2<&1
Run Code Online (Sandbox Code Playgroud)

然后在另一个窗口中运行lsofsleep进程.您将看到文件描述符1和2都指向/dev/null.示例(在我的Mac上):

:; ps axww | grep sleep
 8871 s001  R+     0:00.01 grep sleep
 8869 s003  S+     0:00.01 sleep 99999
:; lsof -p 8869 | tail -2
sleep   8869 mayoff    1w   CHR    3,2       0t0       316 /dev/null
sleep   8869 mayoff    2w   CHR    3,2       0t0       316 /dev/null
Run Code Online (Sandbox Code Playgroud)