問題は特別な変数についてです。ドキュメントによると:
!!:$前のコマンドの最後の引数を指定します 。これは
!$に短縮される場合があります 。
(
$_、アンダースコア。)シェルの起動時に、
環境または引数リストで渡されたとおりに実行されているシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名に設定します。続いて、前のコマンドの最後の引数に展開します 拡張後。また、実行され、そのコマンドにエクスポートされた環境に配置された各コマンドを呼び出すために使用されるフルパス名に設定します。
理解できない違いがあるはずです。理由は次のとおりです。
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
違いは何ですか?
承認された回答:
!$ は履歴拡張の単語指定子であり、履歴の前のコマンドの最後の単語に拡張されます。 。 IOW、歴史の前のエントリの最後の単語。この単語は通常、コマンドの最後の引数ですが、リダイレクトの場合はそうではありません。で:
echo "hello" > /tmp/a.txt
コマンド全体'echo "hello" > /tmp/a.txt' 履歴に表示され、/tmp/a.txt そのコマンドの最後の単語です。
_ シェルパラメータであり、前のコマンドの最後の引数に展開されます。ここでは、リダイレクトはコマンドに渡される引数の一部ではないため、helloのみです。 echoに渡される引数です 。そのため、$_ helloに展開 。
_ はもはやシェル標準の特別なパラメータの1つではありません。 bashで動作します 、zsh 、mksh およびdash インタラクティブな場合のみ、ksh93 2つのコマンドが別々の行にある場合のみ:
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1