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

Law*_*ton 14 bash redirect

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

这相当于:

if $verbose
then
  redirect="> /dev/null"
fi

echo "Verbose mode enabled" $redirect # This doesn't work because the redirect isn't evaluated.
Run Code Online (Sandbox Code Playgroud)

我真的想要一个更好的方法,比为每个受影响的语句编写if-elses.

eval可以起作用,但对其他变量有明显的副作用.

Cas*_*bel 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
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它来使用重定向运行任何命令:

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
Run Code Online (Sandbox Code Playgroud)

(如果您需要做的就是回显这个,你当然可以使函数更简单,只需回显第一个参数,而不是将它们全部作为命令运行)


Pau*_*lin 6

不完美,但是如何将重定向设置为“/dev/null”或“/dev/tty”,然后执行

{
   echo "verbose"
    ....
} > $redirect
Run Code Online (Sandbox Code Playgroud)

  • `/dev/stdout`,而不是`/dev/tty`。即使脚本被重定向,使用后者也总是会导致它进入显示。 (8认同)

jho*_*ter 6

另一个问题得到了这个想法:

#!/bin/sh

if [ $SILENT ]; then
    exec &>/dev/null
fi

echo "Silence here."
Run Code Online (Sandbox Code Playgroud)

  • `if [-n"$ SILENT"]` (2认同)