GNU/Linux >> Linux の 問題 >  >> Linux

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

問題は特別な変数についてです。ドキュメントによると:

!!:$

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

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

理解できない違いがあるはずです。理由は次のとおりです。

$ 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で動作します 、zshmksh およびdash インタラクティブな場合のみ、ksh93 2つのコマンドが別々の行にある場合のみ:

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

$ echo 1
1
$ echo $_
1

Linux
  1. 複数のコマンドを同じ行に出力するための 3 つのトリック

  2. 標準出力からの出力の最後の 4 文字を取得する

  3. スラッシュと rsync コマンド

  1. Linuxでの入出力とエラーリダイレクトの操作

  2. Linuxスクリプトコマンドを使用してターミナルセッションをキャプチャして出力する方法

  3. date および watch コマンドの出力をファイルに保存する

  1. 「最後の」コマンドの出力?

  2. コメントされたコマンドの最後の引数にアクセスする方法は?

  3. CentOS / RHEL :history コマンド出力で実行されたコマンドの日時を取得する方法