如何在 bash 中使用花括号运行以下命令?

sta*_*ant 8 command-line bash

我是一个 bash 脚本,我有以下内容

CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new" 
echo "Running $CMD"                                                                                     
`$CMD`                                                                                                  
Run Code Online (Sandbox Code Playgroud)

当我调用脚本时

Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found 
Run Code Online (Sandbox Code Playgroud)

但是当我{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new在命令行上运行时,它工作正常。

我试图逃避{没有成功,我该怎么做?

ilk*_*chu 8

好吧,如果您像这样在命令行上使用变量,它将被拆分为单词,但是在解析{(或if)等语法项之后会发生这种情况。所以,如果你想要那个,你将不得不使用eval

CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"
Run Code Online (Sandbox Code Playgroud)

尽管 noteeval将在当前 shell 中运行变量中的所有内容,包括对变量的赋值(例如,更改IFS可能会对脚本的其余部分产生有趣的影响)。您可以在单独的 shell 中运行它,bash -c "$CMD"以至少减轻变量分配问题。

另请注意,反引号用于捕获命令的输出,并在命令行上使用它,因此这也将$CMD作为命令运行输出:

$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found
Run Code Online (Sandbox Code Playgroud)

如果您将输出重定向到一个文件,这并不重要,但您很可能也不需要它。