实时打印输出并同时将其保存到变量中
Print output live and save it to a variable at the same time
我知道我可以 save the output to a variable 然后 然后 打印它:
VAR=$(command)
echo "$VAR"
但这有一些缺点:
- 我不会看到命令的进度。
- 特别是,在所有
stderr
输出之后会看到所有stdout
输出,很难匹配它们。
- 由于这将导致在命令工作期间没有输出,因此在某些环境中(如 Travis CI)如果命令工作时间足够长,这将终止作业。
那么,我怎样才能保存输出并在控制台上看到它呢?
- 便携式解决方案是首选,但 Linux/MacOS-only 可以在紧要关头使用。
- 解决方案在
errexit
模式下不应有不良副作用
从我的头顶,可以tee
输出到设置为原始标准输出的附加文件描述符:
exec 3>&1
VAR=$(command | tee /dev/fd/3)
需要设置 set -o pipefail
才能在 errexit
模式下检测 command
的错误。
这也行
VAR=$(command | tee /dev/tty)
我知道我可以 save the output to a variable 然后 然后 打印它:
VAR=$(command)
echo "$VAR"
但这有一些缺点:
- 我不会看到命令的进度。
- 特别是,在所有
stderr
输出之后会看到所有stdout
输出,很难匹配它们。
- 特别是,在所有
- 由于这将导致在命令工作期间没有输出,因此在某些环境中(如 Travis CI)如果命令工作时间足够长,这将终止作业。
那么,我怎样才能保存输出并在控制台上看到它呢?
- 便携式解决方案是首选,但 Linux/MacOS-only 可以在紧要关头使用。
- 解决方案在
errexit
模式下不应有不良副作用
从我的头顶,可以tee
输出到设置为原始标准输出的附加文件描述符:
exec 3>&1
VAR=$(command | tee /dev/fd/3)
需要设置 set -o pipefail
才能在 errexit
模式下检测 command
的错误。
这也行
VAR=$(command | tee /dev/tty)