【问题标题】:How do I print STDERR from a subshell?如何从子外壳打印 STDERR?
【发布时间】:2015-12-21 22:24:05
【问题描述】:

使用在How can you diff two pipelines in Bash? 中找到的答案,我编写了一些我想比较输出的shell 脚本:

diff <(script1 | script2) <(script3 | script4)

但是,在 subshel​​l 管道中的任何脚本中打印到 STDERR 的任何错误都会消失。如何让它们在我的外层脚本(包含差异)中打印?

【问题讨论】:

  • 脚本 1..4 中的错误消息不应该消失在黑洞中;你只是将他们的标准输出重定向为给diff的文件。
  • 您在此处提供的代码不会将 stderr 重定向到任何地方,这样它就会转到控制台。请测试您是否提供了足够的信息来重现您询问的任何错误。
  • 嗯,这有点奇怪:我现在似乎无法重现它。其中一个脚本一定是默默地失败了。我想我会将此标记为已解决。

标签: bash shell pipeline io-redirection


【解决方案1】:

脚本 1..4 中的错误消息不应消失在黑洞中;你只是将他们的标准输出重定向为给diff的文件。

例如,给定这些文件:

$ cat script1
#!/bin/bash
echo $0 stdout
echo $0 stderr >&2
$ cat script2
#!/bin/bash
echo $0 stdout
cat -
echo $0 stderr >&2
$ cat script3
#!/bin/bash
echo $0 stdout
echo $0 stderr >&2
$ cat script4
#!/bin/bash
echo $0 stdout
cat -
echo $0 stderr >&2
$

命令行的输出是:

$ diff <(script1 | script2) <(script3 | script4)
./script1 stderr
./script3 stderr
./script2 stderr
./script4 stderr
1,2c1,2
< ./script2 stdout
< ./script1 stdout
---
> ./script4 stdout
> ./script3 stdout
$

【讨论】:

  • 我似乎无法重现我遇到的故障:前几天我进行故障排除时,我的一个脚本一定是默默地失败了,我错误地认为我通过时没有通过 STDERR不正确的命令行选项。我担心我会再次遇到这种情况,因为我正在寻找对脚本进行一些更新:这让我更加安心,它不会默默地失败(尽管我将不得不重新审视一些错误检查)。
猜你喜欢
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2021-05-23
  • 2016-12-24
  • 2011-07-31
  • 1970-01-01
  • 2017-03-26
相关资源
最近更新 更多