this perldoc page

  • 一起捕获命令的 STDERR 和 STDOUT:

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

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

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

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


  • 我不明白 3 和 4 是如何工作的,我不太确定我对 1 和 2 的理解是正确的。以下是我的理解。请纠正我的错误。

    我知道 012 象征 STDINSTDOUTSTDERR
  • 将 2 重定向到 1,以便它们现在都使用相同的流(& 转义 1 确保 STDERR 不会被重定向到名为 1 的文件)
  • 将 2 (STDERR) 重定向到空流,以便它被丢弃
  • 我不明白这个。不应该只是

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

    另外,如果目标是在 STDERR 获取 STDOUT 消息,那么 1>/dev/null 不会将所有内容重定向到 /dev/null 吗?
  • 这里发生了什么?什么是流 3 ?它像一个临时变量吗?
  • 最佳答案

    真的,这些都不是 Perl —— 所有这些都由您使用反引号操作符调用的 shell 处理。所以你最好的阅读是 man shShell 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/

    10-14 17:16