【问题标题】:Print command output while storing in variable存储在变量中时打印命令输出
【发布时间】:2017-11-29 19:22:16
【问题描述】:

我正在 bash shell 中运行单元测试,这可能需要一些时间才能完成,并且这些测试在运行时会打印输出。我希望打印此输出,并且我还希望将输出存储在变量中。但是,如果可能的话,我希望这些事情同时完成,就像tee 命令在写入文件时所做的那样。也许tee 也适用于这种情况……

所以我目前正在这样做:

output=$(ginkgo -r -cover)
echo "$output"

但是,在所有测试运行之前,这显然不会打印单元测试输出。那么如何在测试运行时打印输出,同时将该输出存储在变量中?

【问题讨论】:

    标签: bash stdout io-redirection tee


    【解决方案1】:
    output=$(ginkgo -r -cover | tee /dev/fd/2)
    

    您可以使用 tee 将标准输出发送到标准输出和标准错误。标准输出被捕获到你的变量中,标准错误被打印出来。

    【讨论】:

    • 谢谢。作为后续,我如何确定ginkgo 是否失败。在这种情况下,$? 将打印 0。
    • $( ) 在子 shell 中运行其内容,因此父 shell 将无法使用 PIPESTATUS。但是您可以使用output=$(ginkgo -r -cover | tee /dev/fd/2; exit ${PIPESTATUS[0]}) 让子shell 将管道状态传播为its 退出状态
    【解决方案2】:

    如果你的 shell 是 Bash:

    ginkgo -r -cover | tee ginkgo.out
    output="$(< ginkgo.out)" && rm ginkgo.out
    

    如果您也想捕获标准错误流,您可能需要考虑|&amp; 而不是|。如果您想保留输出文件,您可能想省去rm

    如果您不喜欢临时文件并且您正在交互式运行,

    output="(ginkgo -r -cover |& tee /dev/tty)"
    

    【讨论】:

    • 感谢您的建议。我想到了这个,但希望有一种不涉及临时文件的方法。
    • @AlexP,使用命名管道的方法怎么样?它比直接寻址 /dev/tty 更灵活
    猜你喜欢
    • 2016-09-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多