bash - 这些流重定向如何工作?

标签 bash shell io-redirection

来自 this perldoc page ,

  1. 同时捕获命令的 STDERR 和 STDOUT:

    $output = `cmd 2>&1`;
  2. 捕获命令的 STDOUT 但丢弃其 STDERR:

    $output = `cmd 2>/dev/null`;
  3. 捕获命令的 STDERR 但丢弃其 STDOUT(此处排序很重要):

    $output = `cmd 2>&1 1>/dev/null`;
  4. 交换命令的 STDOUT 和 STDERR 以捕获 STDERR 但保留其 STDOUT 以输出旧的 STDERR:

    $output = `cmd 3>&1 1>&2 2>&3 3>&-`;

我不明白 3 和 4 是如何工作的,我不太确定我对 1 和 2 的理解是否正确。以下是我的理解。不对的地方请指正。

我知道012分别代表STDINSTDOUTSTDERR

  1. 将 2 重定向到 1,以便它们现在使用相同的流(& 转义 1 确保 STDERR不会被重定向到名为 1 的文件)

  2. 将 2 (STDERR) 重定向到空流,以便它被丢弃

  3. 我不明白这个。不应该只是

    $output = `cmd 1>/dev/null`;

    此外,如果目标是在 STDOUT 获取 STDERR 消息,1>/dev/null 不会将所有内容重定向到/dev/null?

  4. 这里发生了什么?什么是流 3?它像一个临时变量吗?

最佳答案

真的,这些都不是 Perl —— 所有这些都是由您使用反引号运算符调用的 shell 处理的。所以你最好的阅读是 man sh,或者 Shell chapter of the Unix standard .

不过,简而言之,对于 #4:

  • 3>&1:打开 FD 3 指向 stdout 当前指向的位置。
  • 1>&2:重新打开 stdout 以指向 stderr 当前指向的位置。
  • 2>&3:重新打开 stderr 以指向 FD 3 当前指向的位置,也就是上一步完成之前 stdout 指向的位置。现在 stdout 和 stderr 已经成功交换。
  • 3>&-:关闭 FD 3,因为不再需要它。

关于bash - 这些流重定向如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3962674/

相关文章:

bash - 在同一行继续输出

bash - 任何 Bash 脚本总是给出 Command not found

shell - 让 Find 只打印文件名,而不是完整路径

unix - 将输出重定向到文件权限被拒绝?

perl - 相当于 Perl 中的 >nul 2>&1 (来自 Batch)?

shell - zsh 重定向,以及参数扩展

bash - Vim on git bash on window(MINGW64) 自动在提交消息上换行

bash which OR operator to use - 管道 v 双管道

Linux GNU getopt : ignore unknown optional arguments?

linux - bash 内置命令 "select"无法通过 shell 脚本中的管道工作