bash - 如果我将输出通过管道传输到 tee,则无法“继续”
问题描述
我有一个 bash 脚本,它使用以下结构几乎可以完成我想要的工作:
for x in 1 2 3
do
{
[[ $x -ne 2 ]] || continue
echo $x
} &>> foo.log
done
我需要更改它,以便输出同时发送到终端和日志文件。但是,这不起作用:
for x in 1 2 3
do
{
[[ $x -ne 2 ]] || continue
echo $x
} 2>&1 | tee -a foo.log
done
看起来,通过创建一个进程,管道阻止我使用continue
.
当然,我可以在没有 的情况下重写我的脚本的逻辑continue
,但在我开始之前,我想知道我是否错过了一种更直接的方法来实现我想要的。
解决方案
您可以将输出重定向到进程替换。
for x in 1 2 3
do
{
[[ $x -ne 2 ]] || continue
echo $x
} 2>&1 > >(tee -a foo.log)
done |
# I suggest to do pipe the output to ex. `cat`, so that the output
# of process substitution will be synchronized with rest of the script
cat
但是为什么不直接重定向整个循环的输出呢?
for x in 1 2 3; do
[[ $x -ne 2 ]] || continue
echo $x
done 2>&1 | tee -a foo.log
您可以退出子流程。如果您愿意这样做,我建议您更换{
}
为(
)
只是为了安全起见,如果您有一天决定删除tee
.
for x in 1 2 3
do
{
[[ $x -ne 2 ]] || exit
echo $x
} 2>&1 | tee -a foo.log
done
推荐阅读
- javascript - onClick 事件后控制台未记录
- python - 字典列表的批量插入
- amazon-web-services - 在 aws cloudformation 模板中引用“自我”?
- rust - 如何在不释放缓冲区本身的情况下释放 Rust 在 FFI 缓冲区顶部分配的所有结构?
- blender-2.76 - 流体是如何在 Blender 等工具中实现的?
- unity3d - 无论Unity3D中的比例如何,如何使长方体的一个特定角点始终位于(0,0,0)?
- r - 在 mutate 中使用 tidy 评估函数而不显式引用原始数据帧
- javascript - 使能够
- apache-spark - 如何在 spark sql 中对数组进行成员操作?
- polymer - 为什么需要 Git 来安装 Polymer-CLI