Bash:如何执行来自变量扩展的重定向

Bash:如何执行来自变量扩展的重定向,bash,Bash,我正在尝试运行一个带有变量的命令,该变量包含另一个禁止jar警告消息的命令。然而,它并没有像预期的那样工作,我也不知道我做错了什么 TEST=${TEST:-2> /dev/null} java -jar ~/bin/aw.jar ${Test} 仅当重定向未加引号且出现在命令行中,而不是源自任何类型的扩展时,才会执行重定向: $ ls $ echo hello >out $ ls out $ cat out hello $ rm * $ echo hello '>out

我正在尝试运行一个带有变量的命令,该变量包含另一个禁止jar警告消息的命令。然而,它并没有像预期的那样工作,我也不知道我做错了什么

TEST=${TEST:-2> /dev/null}
java -jar ~/bin/aw.jar ${Test}

仅当重定向未加引号且出现在命令行中,而不是源自任何类型的扩展时,才会执行重定向:

$ ls
$ echo hello >out
$ ls
out
$ cat out 
hello
$ rm * 
$ echo hello '>out'
hello >out
$ ls
$ x='>out'
$ echo hello $x
hello >out
$ ls
为了解释来自带引号的字符串或扩展的重定向运算符,必须通过
eval
执行命令(但是,请注意,这可能会导致命令的其他部分出现不希望的扩展):


为什么不能直接使用
java-jar~/bin/aw.jar2>/dev/null
?你希望
TEST
经常更改吗?是的,这是一个基于getoptsal的选项集。因此
TEST=${TEST:-..
语法的原因是,你希望
TEST
除了添加
2>/dev/null
之外,还有一些内容可以设置为empty。我可以在声明选项时设置为“exec 2>/dev/null”
$ ls
$ x='>out'
$ eval echo hello $x
$ ls
out
$ cat out
hello