ここで何が起きているか:
$ エコー $SHELL /ビン/バッシュ $ echo -e "foo" ふー エコーする$ /ビン/エコー $ /bin/echo -e "foo" -e フー
直接使用する場合のように、最後の出力は「foo」であると予想されますecho
。
/bin/echo
echo
はプログラムであり、Bashの組み込みコマンドとは異なります。
POSIX標準によると、echo
引数を取るべきではありません。Bashecho
コマンドはこの標準に準拠しておらず、GNUCoreutilsバージョンも準拠していません。他のバージョンはより厳密な場合があります。
/bin/echo
フラグを付けて呼び出すことでバージョンを確認するか--version
、フラグの助けになるかどうかを確認してください--help
。
また、man which
これを示しています:
これは、現在の環境で実行されるファイル(またはリンク)のパス名を返します。引数が厳密にPOSIX準拠のシェルでコマンドとして指定されている場合。
Bashは厳密にはPOSIXに準拠していないため、の戻り値は異なるwhich
場合があります(この場合、echo
組み込みのために異なります)。
詳細については、bashスクリプトのechooutput-eパラメーターの回答を参照してください。どうすればこれを防ぐことができますか?