有些事困扰我很多事。我想重新定向stderr让我们说fd 5.所以我运行以下命令:
me@/home/me>$ exec &2>5
[1] 307
所以我期望这次重定向的结果是,从现在开始,错误将被发送到fd 5.但这就是发生的事情:
me@/home/me>$ mkdir /a 5>/dev/null
mkdir: /a: [Permission denied]
它会在stdout上显示错误。当我重定向2时它没有显示任何内容:
me@/home/me>$ mkdir /a 2>/dev/null
有人可以解释我错在哪里吗?
答案 0 :(得分:1)
exec &2>5
这不会将stderr
重定向到文件描述符5.它会将其重定向到名为5
的文件。
请注意,正如glenn jackman在评论中提到的,这是在仅由后台exec
创建的子shell中完成的(您使用的&
并不意味着2
将被视为文件描述符。这意味着exec
将在后台调用!
mkdir /a 5>/dev/null
此重定向文件描述符5为/dev/null
。
您可以将stderr
重定向到这样的文件:
mkdir /a 2>some-file
现在看看它们之间的区别:
mkdir /a 2>&1 # redirect stderr to fd 1, which is stdout
mkdir /a 2>1 # redirect stderr to file named "1"
mkdir /a >x 2>&1 # redirect stdout to x, AND stderr to stdout, which also goes into x
mkdir /a 2>&5 # redirect stderr to fd 5, presuming there IS an open file with fd 5