web-dev-qa-db-ja.com

$ _対!$。前のコマンドの最後の引数と出力リダイレクト

問題は特殊変数についてです。ドキュメントは言う:

!!:$

前のコマンドの最後の引数を指定します。これは!$に短縮される場合があります。


$_、アンダースコア。)シェルの起動時に、実行中のシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名を、環境または引数リストで渡されたとおりに設定します。その後、展開後に前のコマンドの最後の引数に展開します。また、そのコマンドにエクスポートされた環境で実行および配置された各コマンドを呼び出すために使用される絶対パス名に設定します。

次の理由で、私がキャッチできないいくつかの違いがあるはずです。

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

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

違いはなんですか?

35
Loom

!$は、履歴拡張のワード指定子で、historyの前のコマンドの最後のワードに拡張されます。 IOW、過去のエントリの最後の言葉。このWordは通常、コマンドの最後の引数ですが、リダイレクトの場合はそうではありません。に:

echo "hello" > /tmp/a.txt

コマンド'echo "hello" > /tmp/a.txt'全体が履歴に表示され、/tmp/a.txtはそのコマンドの最後の単語です。

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

_シェル標準の特別なパラメーター のいずれでもありません。 bashzshmkshおよびdashで動作するのは、対話型の場合のみです。ksh93は、2つのコマンドが別々の行にある場合のみです。

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

$ echo 1
1
$ echo $_
1
40
cuonglm