我有一个调用了几个长时间运行进程的bash脚本。我希望捕获这些调用的输出到变量中以进行处理。但是,由于这些是长时间运行的进程,我想要rsync调用的输出在控制台上实时显示,而不是事后显示。
为此,我找到了一种方法(链接),但它依赖于将文本输出到/dev/stderr。 我认为输出到/dev/stderr并不是一个好的做法。
在上面的示例中,我多次调用rsync并希望在处理文件名时看到它们,但最终仍希望将输出存储在变量中,因为稍后我会解析它。是否有一种更'简洁'的方法来实现这一点?如果有区别,我正在使用Ubuntu 12.04和bash 4.2.24。
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。
exec 5>&-
对吧? - hakreFF=$(echo aaa | tee /dev/tty)
怎么样? - knight42tee >(inner_cmd...)
时,shell会打开一个管道到内部命令,使得管道的写入端也被外部命令(tee)继承,通常在描述符63下。外部命令不知道shell做了什么有趣的事情,它得到了一个文件名参数/dev/fd/63
。https://en.wikipedia.org/wiki/Process_substitution 不知道为什么你会得到这个错误,但它与内部命令写入描述符5无关。 - Beni Cherniavsky-Paskin