$_ と !$。前のコマンドの最後のパラメータと出力リダイレクト

$_ と !$。前のコマンドの最後のパラメータと出力リダイレクト

問題は特殊変数に関するものです。文書には次のように記載されています。

!!:$

指定する前のコマンドの最後のパラメータ。これにより短縮できます!$


$_、下線。)シェルが起動したら、環境または引数リストに渡されたシェルを呼び出すために使用される絶対パス名または実行中のシェルスクリプトに設定します。後で次に拡張前のコマンドの最後のパラメータ拡張後。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。

次の理由で私が捕まえられない違いがあります。

$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt

$ echo "hello" > /tmp/a.txt
$ echo $_
hello

違いは何ですか?

答え1

!$歴史的拡張のための単語インジケータ。前のコマンドの最後の単語に展開されます。歴史。つまり、歴史上、前の項目の最後の単語です。この単語は通常コマンドの最後のパラメータですが、リダイレクトの場合はそうではありません。存在する:

echo "hello" > /tmp/a.txt

完全なコマンドは'echo "hello" > /tmp/a.txt'歴史に現れ、/tmp/a.txtコマンドの最後の単語です。

_シェルパラメータで、前のコマンドの最後のパラメータに展開されます。ここで、リダイレクトはコマンドに渡されるパラメータの一部ではないため、 にのみhello渡されますecho$_hello

_もはやそれらの一つではありません。シェル標準特殊パラメータ。両方のコマンドが別々の行、、、およびbashzshあるmksh場合にのみ対話的に機能します。dashksh93

$ echo 1 && echo $_
1
/usr/bin/ksh

$ echo 1
1
$ echo $_
1

答え2

パラメータ置換を直接使用することは不可能ではなくても難しいです!$

wget http://foo.com/my.tarたとえば、できますが、tar xf ${_##*/}中間!$変数を定義しないと不可能です。

関連情報