我正在尝试修改使用以下内容的脚本:
# first portion of script
# ...
exec > >(tee -ia $OUT)
# ...
# second portion of script
我对这个脚本的问题是它会向stdout
(我的终端)产生大量输出。脚本作者没有包含消除终端输出的选项。我想添加一个选项来删除stdout
, 并仅在文件中获取输出$OUT
。
这是我尝试过的:
TERM_OPT="OFF"
# first portion of script
# ...
if [ $TERM_OPT != "OFF" ]; then
exec > >(tee -ia $OUT)
else {
# ...
# second portion of script
} > $OUT
fi
这似乎有效,但我不确定在这种情况下是否使用大括号,因为 分组命令的 GNU 部分(似乎)声明列表后面需要一个分号。但添加或删除似乎没有什么区别。我想知道是否应该使用括号而不是花括号,但这会导致 中的所有内容都在子 shell 中执行。我对此并不是特别热衷,因为它是其他人的脚本,而且我不清楚subshell 的含义(我没有尝试过)。{}
;
;
()
()
我尝试的另一件事似乎是一个黑客,但我读到其他人使用它,它似乎也工作正常:
TERM_OPT="OFF"
# first portion of script
# ...
if [ $TERM_OPT != "OFF" ]; then
exec > >(tee -ia $OUT)
else
exec > >(tee -ia $OUT 1> /dev/null)
fi
# ...
# second portion of script
我喜欢这个,因为它看起来更独立,但这并不是一个需要考虑的因素。
所以问题是: 执行此操作的正确方法是什么?我的意思是,在 后选择退出终端输出的正确方法是什么exec > >(tee -ia $OUT)
?这些解决方案中的一种比另一种更可取——还是我需要做一些完全不同的事情?
只有
$OUT
在挂起模式下重定向到文件a
才会容易得多:请注意,shell 不会等待
tee
退出,因此您可能会发现tee
脚本完成后仍在输出某些内容。看看
A
B之后的输出如何。要解决这个问题,您可以添加:
在脚本的末尾或陷阱中
EXIT
。另一个选择(也可以在 sh 中使用)是将整个脚本放入一个
main
函数中并执行以下操作:如果您想重定向 stdout 以附加到文件,并且不在终端上保留输出的副本,只需执行以下操作:
的唯一目的
tee
是将一个流复制为多个流,因此如果您只想将输出放在一个位置,则不需要它。你tee -ia "$OUT" > /dev/null
当然也可以工作,但这有点愚蠢:你仍然会复制输出,只是为了丢弃另一个副本。大括号需要分号或换行符。它实际上在手册中说:“列表后面需要分号(或换行符)。” 括号两者都不需要。
子 shell 的含义是,子 shell 在 shell 的独立副本中运行,子 shell 中的任何更改在其外部都是不可见的。如果脚本在子 shell 结束时结束,那没有多大意义,子 shell 所做的只是启动一个不需要的进程。
我会选择类似的东西