我编写了一些执行大量外部命令的 BASH 代码(导致副作用)。因此,为了开发和调试,我想将执行包装在 shell 函数中,以便执行或打印命令。
所以基本代码是:
run()
{
if [ "$print_commands" -ne 0 ]; then
echo "$@"
else
"$@"
fi
}
不幸的是,大多数外部命令在成功时会输出一些内容(例如“成功”),因此我一直在使用> /dev/null
重定向此类输出。然而,有一些状态查询做输出状态,并且不能丢弃。
所以显然我不能添加到> /dev/null
里面run
;我也不想添加第二个重定向函数,从而重复大多数代码。
我尝试了这样的解决方案:
silence='>/dev/null'
run some_command with params $silence
silence
这个想法是在打印命令时设置为空字符串,这是有效的,但是在执行命令时我得到:
错误:无法识别的参数:>/dev/null
是否有一些不使用的半途优雅解决方案eval
?
答案1
为什么不检查函数中的另一个变量run
并使用它来确定重定向?
run()
{
if [ "$print_commands" -ne 0 ]; then
echo "$@"
elif [ "$silence" -ne 0 ]; then
"$@" > /dev/null
else
"$@"
fi
}
然后:
silence=1 run some_command with params whose output is not needed
silence=0 run some_command with params whose output is needed
或者您可以将命令输出到 stderr 而不是 stdout:
run()
{
if [ "$print_commands" -ne 0 ]; then
echo "$@" >&2
else
"$@"
fi
}
答案2
基于https://unix.stackexchange.com/a/726123/320598我决定添加一个额外的第一个参数来run
控制重定向到/dev/null
:
run()
{
declare silence="$1"; shift
if [ "$print_commands" -ne 0 ]; then
echo "$@"
elif [ "$silence" -ne 0 ]; then
"$@" > /dev/null
else
"$@"
fi
}
run 0 non_redirected_command params
run 1 redirected_command params