Bash:将未转义的 string/characters 从变量插入命令

Bash: Insert unescaped string/characters from variable into command

在 bash(GNU bash,版本 3.2.57)中,我想将变量(未转义)的确切内容替换为以下命令。

为了说明我的意思,给定以下字符串变量:

s="2>&1 > /dev/null"

如果我尝试将确切的字符串插入到命令中:

bash --version $s || echo "will install bash"

(此命令只是为了问题的简单示例)

实际执行的命令是这样的:

bash --version '2>&1' '>' /dev/null

插入的字符串被转义,这是我不想要的。

我想要的是以某种方式将未转义的 s 的内容插入到执行的命令中,以便执行的命令是这个:

bash --version 2>&1 > /dev/null

我怎样才能做到这一点?

How could I achieve that ?

使用函数代替变量。

run_this_silent() {
     "$@" 2>&1 >/dev/null
}
run_this_silent bash --version

如果不使用 eval(或等效的 bash -c COMMAND)是不可能在变量中存储重定向的,几乎在所有可以想象的情况下都使用 eval is a bad solution。如果您想无条件地使一个命令(或一百个命令)静音,最好将重定向显式添加到它们中的每一个。