bash - 将标准输出捕获到变量但仍将其显示在控制台中

标签 bash ubuntu tee process-substitution

我有一个 bash 脚本,它调用几个长时间运行的进程。出于处理原因,我想将这些调用的输出捕获到变量中。但是,因为这些是长时间运行的进程,我希望 rsync 调用的输出实时而不是事后显示在控制台中。

为此,我有 found一种方法,但它依赖于将文本输出到/dev/stderr。我觉得输出到/dev/stderr 不是一个好的做事方式。

VAR1=$(for i in {1..5}; do sleep 1; echo $i; done | tee /dev/stderr)

VAR2=$(rsync -r -t --out-format='%n%L' --delete -s /path/source1/ /path/target1 | tee /dev/stderr)

VAR3=$(rsync -r -t --out-format='%n%L' --delete -s /path/source2/ /path/target2 | tee /dev/stderr)

在上面的例子中,我调用了 rsync 几次,我想在处理文件时查看文件名,但最后我仍然希望输出在一个变量中,因为我稍后会解析它。

是否有一种“更简洁”的方式来完成此任务?

如果有区别,我使用的是 Ubuntu 12.04,bash 4.2.24。

最佳答案

在您的 shell 中复制 &1(在我的示例中为 5)并在子 shell 中使用 &5(这样您将写入标准输出(&1) 的父 shell):

exec 5>&1
FF=$(echo aaa|tee >(cat - >&5))
echo $FF

这将打印两次“aaa”,一次是因为子 shell 中的回显,第二次是打印变量的值。

在您的代码中:

exec 5>&1
VAR1=$(for i in {1..5}; do sleep 1; echo $i; done | tee >(cat - >&5))
# use the value of VAR1

关于bash - 将标准输出捕获到变量但仍将其显示在控制台中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451278/

相关文章:

bash - 以正确的字母数字顺序获取文件名

我可以从 c 程序与打开的 vt 交互吗?

Linux bashrc 困惑

bash - 如何在保持流分离的同时将 stdout+stderr 重定向到一个文件?

linux - 我如何在 CentOS 6.X 中使用带有 tee 的记录器

linux - 将长标准输出管道传输到 tee 命令有时会导致截断

linux - ssh 进入虚拟机时,未通过脚本正确设置环境变量

bash - 寻找匹配 `)' 时出现意外的 EOF 错误

c++ - 在 C++ 中 fork 和 kill 导致 ubuntu 崩溃

Docker 构建依赖于主机 Ubuntu 版本而不是实际的 Docker 文件