4

我多么希望它工作。

if [ $debug = 0 ]; then
   silent=""
else
   silent='> /dev/null 2>&1'
fi

#some command
wget some.url $silent

因此,如果设置了 $debug,它将变为

wget some.url > /dev/null 2>&1

否则,如果 $debug 没有设置为 1,它变成

wget some.url

将 "> /dev/null 2>&1" 存储在变量中不起作用。我怎样才能做到这一点?

4

4 回答 4

5

这可能是使用 shell 函数的一个很好的借口:

silent() {
    "$@" > /dev/null 2>&1
}

现在,您可以通过以下方式运行程序来使程序静音:

silent wget some.url

如果您只想有条件地使事物静音,那很容易:

silent() {
  if [[ $debug ]] ; then
    "$@"
  else
    "$@" &>/dev/null
  fi
}
于 2013-07-23T14:02:35.107 回答
3

您需要 shell 将变量内容实际解释为命令行的一部分,而不仅仅是作为要作为参数传递给可执行文件的字符串。查看eval内置的 shell

注意安全漏洞!

于 2013-07-23T14:00:23.123 回答
2

一种略有不同的方法,但类似这样的方法可能有效:

if [ $debug = 1 ]; then
   exec > /dev/null
fi

#some command
wget some.url

它有条件地替换stdout/dev/null.

于 2013-07-23T14:05:25.910 回答
1

使用eval

eval wget some.url $silent

eval导致参数被重新解释为 shell 命令,而不是作为被调用程序的参数。

当心; 不要eval在未知或外部输入上运行,否则您将面临一个很大的安全漏洞。

于 2013-07-23T14:00:29.653 回答