これが私がbashに入れたものと私が 'echo'について得た結果です:
$ echo '!$'
!$
$ echo "!$"
echo "'!$'"
'!$'
'echo'が2番目の入力をどのように処理するか知りたいのですが。 'echo'は、最初に入力した文字列を出力し(必要に応じて一部を展開し)、次に実行可能かどうかを確認して実行するように思われます。
私が構築できるが理解できない、より驚異的な例は次のとおりです。
$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$
コマンドで:
echo "!$"
!$
はbash
に渡される前に、echo
によって展開されます。 二重引用符で囲みます 有効にすると、バックスラッシュ!
を使用して\
をエスケープしない限り、履歴の展開が実行されます。 bash
は展開を実行し、echo
はここでは何も実行せず、取得したものを出力するだけです。
!$ 前のコマンドの最後の引数である文字列'!$'
を参照します。
2番目の例では:
$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$
コマンドecho "echo '!$' "'!$'""
、echo
に渡される引数は、次の3つの部分に分かれています。
"echo '!$' "
、文字列echo '!$'
に展開されます。'!$'
、文字列!$
に展開されます。""
、空の文字列に展開されます。echo
は単に引数を繰り返し、標準出力に送信します。
すべての魔法はシェルによって行われます。シェルはあるパターンを他のパターンに置き換えます。変数($
で始まる)、履歴(!
で始まる)など。
詳細については、bash
マニュアルを参照してください。