web-dev-qa-db-ja.com

感嘆符付きの文字列のエコー

これが私がbashに入れたものと私が 'echo'について得た結果です:

$ echo '!$'   
!$  
$ echo "!$"  
echo "'!$'"  
'!$'

'echo'が2番目の入力をどのように処理するか知りたいのですが。 'echo'は、最初に入力した文字列を出力し(必要に応じて一部を展開し)、次に実行可能かどうかを確認して実行するように思われます。

私が構築できるが理解できない、より驚異的な例は次のとおりです。

$ echo '!$'  
!$  
$ echo "!echo "!$""  
echo "echo '!$' "'!$'""  
echo '!$' !$
8
booksee

コマンドで:

echo "!$"

!$bashに渡される前に、echoによって展開されます。 二重引用符で囲みます 有効にすると、バックスラッシュ!を使用して\をエスケープしない限り、履歴の展開が実行されます。 bashは展開を実行し、echoはここでは何も実行せず、取得したものを出力するだけです。

!$ 前のコマンドの最後の引数である文字列'!$'を参照します。

2番目の例では:

$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$

コマンドecho "echo '!$' "'!$'""echoに渡される引数は、次の3つの部分に分かれています。

  • 最初:"echo '!$' "、文字列echo '!$'に展開されます。
  • 2番目:'!$'、文字列!$に展開されます。
  • 3番目:""、空の文字列に展開されます。
8
cuonglm

echoは単に引数を繰り返し、標準出力に送信します。

すべての魔法はシェルによって行われます。シェルはあるパターンを他のパターンに置き換えます。変数($で始まる)、履歴(!で始まる)など。

詳細については、bashマニュアルを参照してください。

2
ctrl-alt-delor