如何将“> / dev / null 2>& 1”放入变量中?

时间:2013-07-23 13:58:19

标签: bash

我希望它如何运作。

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 个答案:

答案 0 :(得分:5)

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

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

现在你可以通过以下方式运行程序来使程序沉默:

silent wget some.url

如果你只想有条件地保持沉默,这很容易:

silent() {
  if [[ $debug ]] ; then
    "$@"
  else
    "$@" &>/dev/null
  fi
}

答案 1 :(得分:3)

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

注意安全漏洞!

答案 2 :(得分:1)

略有不同的方法,但这样的方法可能有效:

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

#some command
wget some.url

它有条件地将stdout替换为/dev/null

答案 3 :(得分:0)

使用eval

eval wget some.url $silent

eval会将参数重新命名为shell命令,而不是作为被调用程序的参数。

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