如何有条件地将命令输出重定向到/ dev / null?

时间:2010-03-25 23:11:17

标签: bash redirect

我有一个脚本。我想给这个脚本一个安静模式和一个详细模式。

这相当于:

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可以工作,但对其他变量有明显的副作用。

4 个答案:

答案 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上计算的内容。

它还允许您按流分割详细日志和标准日志。

这可能不是你需要的,但它可以是一个方便的技巧。