Bashで中かっこを使用して次のコマンドをどのように実行できますか?

Bashで中かっこを使用して次のコマンドをどのように実行できますか?

私のbashスクリプトには次の内容があります

CMD="{ head -n1 $DATE.$FROMSTRAT.new && egrep -i \"$SYMS\" $DATE.$FROMSTRAT.new; } > $DATE.$TOSTRAT.new" 
echo "Running $CMD"                                                                                     
`$CMD`                                                                                                  

私がスクリプトを呼び出すとき

Running { head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.new
script.sh: line 17: {: command not found 

しかし、{ head -n1 inputFile.new && egrep -i "X|Y" inputFile.new; } > outputFile.newコマンドラインから実行すると正常に動作します。

脱出しようとしましたが{失敗しました。どうすればいいですか?

ベストアンサー1

さて、コマンドラインでこれらの変数を使用すると単語に分割されますが、これは{(または)などの構文エントリを解析した後に発生します。ifしたがって、これが必要な場合は、次のものを使用する必要があります。eval

CMD="{ echo blah ; echo bleh; } > output"
eval "$CMD"
# output contains "blah" and "bleh"

evalnote は、変数の割り当てを含む現在のシェルの変数にあるすべてを実行します (IFSたとえば、変更はスクリプトの残りの部分に興味深い影響を与える可能性があります)。bash -c "$CMD"少なくとも変数割り当ての問題を軽減するために、別のシェルで実行できます。

また、バックティックはコマンドの出力をキャプチャしてコマンドラインで使用するために使用されるため、出力もコマンド$CMDとして実行されます。

$ CMD="echo foo"
$ `$CMD`
-bash: foo: command not found

出力をファイルにリダイレクトすることは重要ではありませんが、ほとんど必要ありません。

おすすめ記事