問題は特殊変数に関するものです。文書には次のように記載されています。
!!:$
指定する前のコマンドの最後のパラメータ。これにより短縮できます
!$
。
(
$_
、下線。)シェルが起動したら、環境または引数リストに渡されたシェルを呼び出すために使用される絶対パス名または実行中のシェルスクリプトに設定します。後で次に拡張前のコマンドの最後のパラメータ拡張後。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。
次の理由で私が捕まえられない違いがあります。
$ 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
_
もはやそれらの一つではありません。シェル標準特殊パラメータ。両方のコマンドが別々の行、、、およびbash
にzsh
あるmksh
場合にのみ対話的に機能します。dash
ksh93
$ echo 1 && echo $_
1
/usr/bin/ksh
$ echo 1
1
$ echo $_
1
答え2
パラメータ置換を直接使用することは不可能ではなくても難しいです!$
。
wget http://foo.com/my.tar
たとえば、できますが、tar xf ${_##*/}
中間!$
変数を定義しないと不可能です。