問題は特殊変数に関するものです。ドキュメントは言う:
!!:$
前のコマンドの最後の引数を指定します。これは!$に短縮できます。
(
$_
、アンダースコア。)シェルの起動時に、環境または引数リストに渡されて実行されるシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名に設定します。その後、展開後、前のコマンドの最後の引数に展開します。また、そのコマンドにエクスポートされた環境で実行および配置された各コマンドの呼び出しに使用されるフルパス名に設定されます。
次の理由により、キャッチできない違いがあるはずです。
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
違いはなんですか?
4
!$は履歴拡張であり、特別な変数ではないため、bashコードはそれらを異なる方法で処理すると想定します。
—
ジェフシャラー
Bourneシェル言語はおそらく、のいずれか①:私はこの質問に対する明確な答えを持っていますが、いない、まだ今日広く使用され、少なくとも内部的に一貫性のあるプログラミング言語。一般原則を推測しようとしても、何も得られません。特別なルールをすべて覚えておくだけです。ごめんなさい。②の定義で、強調表示したフレーズの直後の「展開後」という言葉に注意してください。それは重要です。それはあなたを困惑させる違いを説明しないかもしれませんが、それは他の多くの方法を説明し、同じではありません。
—
-zwol
$_
$_
!$