我有一个脚本。我想给这个脚本一个安静模式和一个详细模式。
这相当于:
if $verbose
then
redirect="> /dev/null"
fi
echo "Verbose mode enabled" $redirect # This doesn't work because the redirect isn't evaluated.
我真的想要一个更好的方法来做这件事,而不是为每个受影响的语句写if-elses。
eval可以工作,但对其他变量有明显的副作用。
答案 0 :(得分:10)
你可以写一个包装函数:
redirect_cmd() {
# write your test however you want; this just tests if SILENT is non-empty
if [ -n "$SILENT" ]; then
"$@" > /dev/null
else
"$@"
fi
}
然后,您可以使用它来运行带有重定向的任何命令:
redirect_cmd echo "unsilenced echo"
redirect_cmd ls -d foo*
SILENCE=1
redirect_cmd echo "nothing will be printed"
redirect_cmd touch but_the_command_is_still_run
(如果您需要做的就是回显这个,你当然可以使函数更简单,只需回显第一个参数而不是将它们全部作为命令运行)
答案 1 :(得分:6)
从another question获得了这个想法:
#!/bin/sh
if [ $SILENT ]; then
exec &>/dev/null
fi
echo "Silence here."
答案 2 :(得分:3)
不完美,但如何将重定向设置为“/ dev / null”或“/ dev / tty”,然后执行
{
echo "verbose"
....
} > $redirect
答案 3 :(得分:0)
考虑是否值得设置set -x
以详细记录到详细模式下的stderr。如果是这样的话,那么可以使用像这样的无操作:
来实现详细输出。
while getopts "v" o
do case "$o" in
v) set -x;;
esac
done
echo "This will always be output" # goes to stdout
: this will only be output in verbose mode # goes to stderr
:
评估它的参数,但对它们没有任何作用。
set -x
将显示在执行每个语句时在stderr上计算的内容。
它还允许您按流分割详细日志和标准日志。
这可能不是你需要的,但它可以是一个方便的技巧。