このコマンドで{}が機能しないのはなぜですか?

このコマンドで{}が機能しないのはなぜですか?

.以下の コードスニペットから: {}()

#!/bin/bash
set -e
echo "two">file.txt
ARRAY=(one two three)
rc=0
for i in ${ARRAY[@]}; do
    echo "grepping $i "
    #grep "$i" file.txt || (echo "failed grep" && exit 1) <--1
    #grep "$i" file.txt || {rc=$? && echo "failed grep"}  <--2
    grep "$i" file.txt || (rc=$? && echo "failed grep")   <--3
done

exit $rc  

コマンド2は動作しない唯一のコマンドです。しかし、私はそれがうまくいくと予想しており、コマンド1は許可された答えに従ってスクリプトを終了しません。ここ
何が起こっているのかを説明できる人はいますか?

ベストアンサー1

bashほとんどのPOSIXシェルでは、while(とはシェル構文の特殊表示文字です(、、、、、...)などの複数文字表示の一部を含む、発生するたびに特別に処理されます)。組み合わせは、inなどの特殊表示文字を使用するか、特殊またはフォームに使用されます。(($(<($((<#(({}${{x,y}{x..y}

echo )whileはエラーが発生しますが、echo }出力がないため、inを閉じることは不可能であることがわかります。}}{echo}{

具体的{}キーワード良いwhile、、、。time!コマンドが必要な場合にのみ(最初の近似で)別の単語としてのみ表示できます。

{echo次のキーワード{echoではなくコマンドになります。キーワードの後に​​itが来るのではなく、コマンドと同じです。{echowhile[while[while[

とが分離されてコマンド位置にある場合、またはを使用できますが、は使用できません{ echo;}{<file cat;}{}{echo}

しかし、いくつかの例外があります。通常、リダイレクト以外には何も起こらず、コマンドの位置にない{(echo test)}閉じた後もこれが機能することがわかります。指揮ポジションにいない二人目も同様です。)}{ { echo; } }}

{ echo; ! }または{ echo; time }ksh93では動作しますが、動作しません(コマンド位置にbashあっても)。}

1つの例外は、可能な場合とトークンとして認識zshしようとすることです。つまり、指揮位置にあり、特定の限られた状況にあるときです。そこでは動作しますが、たとえば動作しません。 bash / kshの代わりにそこのようです。{}{echo}{{echo}}{{echo} }{echo,foo}{ echo,foo;}echo foo

<file {head;head}動作しますzshが、他のシェルでは動作しません。

これはIGNORE_BRACESオプションによってIGNORE_CLOSE_BRACES制御されます。

おすすめ記事