grepが私の家のコンピュータとオフィスのコンピュータで異なる動作をするのはなぜですか? [閉じる]

grepが私の家のコンピュータとオフィスのコンピュータで異なる動作をするのはなぜですか? [閉じる]

以下のコードを実行すると、マイコンピュータで検出されますが、私のオフィスコンピュータで同じコマンドを実行すると検出されません。このあいまいな動作の理由は何ですか?

$ pはテキストファイルの1行で、 xyzxyz if ( abc ) 読み込み中にgrepに行を渡すために使用されます。

grep -qw -e 'if(' -e 'if' <<< $p
if [ $? -ne 0 ]; then

do something

fi

答え1

以前のバージョンには対応するbashバグ/無効な機能がありました。

 cat <<< $var

の内容は$var単語に分割されますが(ワイルドカードで区切られていません)、結果の単語はスペースで連結された次のコマンドへの入力として設定された一時ファイルに保存されますcat

<<<これは、このzsh演算子をサポートする他のシェルとの整合性を維持するためにbash-4.4で修正されました。

以前のバージョンでは、これは変数を参照する必要がある別のケースです。

したがって、以下を$IFS含めると違いを説明できます。if

$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if

とにかく、-e 'if('テキストにif(単語が含まれている場合はif単語も含まれるため、重複することに注意してください。

また、bash正規表現一致機能が組み込まれているので、いつでも次のことができます。

re='\<if\>'
if [[ $p =~ $re ]]; then
  printf '"%s" contains a "if" word\n' "$p"
fi

(少なくともLinux MintやRHELなどのシステムではEREにありますが、\<サポートしている場合は\>EREにはあります。grep-w\<\>

(上記の場合は、引用が不要な非常にまれなケースの1つです$p(引用しても問題にはなりません)。$re 必然ではない引用符(そうでなければ、内容は正規表現ではなく固定文字列として扱われます)

標準sh構文を使用して、次のこともできます。

case +$p+ in
  (*[^[:alnum:]_]if[^[:alnum:]_]*)
    printf '"%s" contains a "if" word\n' "$p"
esac

同じ効果を得るために。

関連情報