【问题标题】:Print output live and save it to a variable at the same time实时打印输出并同时将其保存到变量中
【发布时间】:2019-04-08 04:37:52
【问题描述】:

我知道我可以save the output to a variable然后打印出来:

VAR=$(command)
echo "$VAR"

但这有很多缺点:

  • 我不会看到命令的进度。
    • 特别是,将在所有stderr 输出之后看到所有stdout 输出,从而难以匹配它们。
  • 由于这将导致在命令工作期间没有输出,因此在某些环境(如 Travis CI)中,如果命令工作时间足够长,这将终止作业。

那么,如何保存输出并在控制台上实时查看?

  • 便携式解决方案是首选,尽管只有 Linux/MacOS 的解决方案可以在紧要关头完成。
  • 解决方案不应在errexit 模式下产生不良副作用

【问题讨论】:

    标签: bash platform-agnostic


    【解决方案1】:

    从我的脑海中,可以tee 输出到一个附加的文件描述符设置为原始标准输出:

    exec 3>&1
    VAR=$(command | tee /dev/fd/3)
    

    需要设置set -o pipefail 以检测commanderrexit 模式下的错误。

    【讨论】:

      【解决方案2】:

      这也可以

      VAR=$(command | tee /dev/tty)
      

      【讨论】:

      • Stdout 不一定是/dev/tty
      • @ivan_pozdeev 如果我没有/dev/tty,则屏幕不会打印输出,而只会将结果设置为 VAR。
      • 我的意思是,可以重定向包含复合命令或整个脚本的输出,使其不是/dev/tty。在这种情况下,直接打印到/dev/tty 会产生不良影响。
      猜你喜欢
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多