!$はどういう意味ですか?


32

私はチュートリアルを進めていますが、このコマンドを実行することを言及しています:

sudo chmod 700 !$

私はよく知らない!$。どういう意味ですか?


5
一般的に、echo何をするかわからない場合は、何かを試しても安全です。
シャドゥール

8
@Shadur、常にではありません。 echo $(rm -rf /)
cjm

1
@cjm本当に古いシステムを使用している場合を除き--no-preserve-root、そこにオプションが必要になります。プログラムで「保存しない」という言葉が表示される場合は、その機能について慎重に考えてください。
wchargin

4
@WChargin「本当に古い」と「Linux / GNU coreutilsを使用していない」は同じものであると仮定して、非常に注意してください。そうではありません。
クリスダウン

回答:


44

基本的に、それは前のコマンドの最後の引数です。

!$前のコマンドの「終了」です。次の例を考えてみましょう。ファイル内の単語を探すことから始めます。

grep -i joe /some/long/directory/structure/user-lists/list-15

joeがそのユーザーリストに含まれている場合は、joeを削除します。引数としてその長いディレクトリツリーを使用してviを起動するか、vi !$Which bashが次のように展開するように単純に実行できます。

vi /some/long/directory/structure/user-lists/list-15

ソース ;ところで、便利なガイド)


この!$トークンと特別なシェル変数の違いは何の価値もありません$_。実際、両方とも前のコマンドの最後の引数に展開されます。ただし、!$履歴の展開$_に展開され、パラメータの展開中に展開されます。これの重要な結果の1つは、を使用する!$と、展開されたコマンドが履歴に保存されることです。

たとえば、キーストロークを考えます

  • echo Foo Enter echo !$ Jar Enter Up Enter; そして

  • echo Foo Enter echo $_ Jar Enter Up Enter

(変更された文字は$!$_の中央のみです。)

前者では、を押すUpとコマンドラインがを読み取るecho Foo Jarため、stdoutに書き込まれる最後の行はFoo Jarです。

後者では、を押すUpとコマンドラインが読み取りますがecho $_ bar$_以前とは異なる値になりました。実際は$_isですJarので、stdoutに書き込まれる最後の行はJar Jarです。

別の結果として_、コマンドのシーケンスなど、他のパラメーター展開で使用できます

printf '%s '    isomorphism
printf '%s\n'   ${_%morphism}sceles

印刷しisomorphism isoscelesます。しかし、類似の「${!$%morphism}」拡張はありません。

Bashでの拡張のフェーズの詳細についてはEXPANSIONman 1 bash(オンライン版ではシェル拡張と呼ばれる)のセクションを参照してください。HISTORY EXPANSIONセクションは別のものです。


6
いいね 知っておくといい。また、Stack Exchangeもあります。次のようなものをGoogleで検索するのは難しいです!$
アンドリュー

4
ところで、コマンドラインでinsert-last-argument、通常はにバインドされたによって、前のコマンドの最後の引数を挿入できますM-.
チョロバ

1
@Andrewが質問に答える場合、これを受け入れることを忘れないでください。コメントを投稿するのではなく、承認し、賛成することは、SEネットワークでどのように感謝が表明されるかです。「公式」スタンスについては、こちらを参照してください。
テルドン

1
@Andrew FYI、Googleで「bash bang dollar」を検索し、このリンクを3番目のリストとして含めて、適切な結果を得ました。
wchargin

1
@terdon私は昨夜答えを受け入れようとしましたが、それが速すぎたので、受け入れるのを待たなければなりませんでした。
アンドリュー

4

厳密に言えば!$、履歴リストの最後のコマンドの最後の単語です。

word-シェルによってユニットとして扱われる一連の文字。単語に引用符で囲まれていないメタキャラクターを含めることはできません。

メタ文字-引用符で囲まれていないときに単語を区切る文字。メタキャラクターは、空白または次の文字のいずれかです: '|'、 '&'、 ';'、 '('、 ')'、 '<'、または '>'

空白-スペースまたはタブ文字。

例:

set -o history # enable command history
set -o histexpand # enable ! style history substitution

HISTSIZE=10

# save all lines on the history list    
HISTCONTROL=
HISTIGNORE=

date
echo !$ # prints date

date>/dev/null
echo !$ # prints /dev/null

echo a b c>/dev/null
echo !$ # prints /dev/null

HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list
echo a b c
 echo d e f # space at the beginning
echo !$ # prints c


-3

!$ その特定のユーザーに使用された最後のコマンドが表示されます。

コマンドを使用して、以前に使用したhistoryコマンドの履歴を見つけることもできます...試してみてください...

注:特定のユーザーの場合、以前に使用したすべてのコマンドはbash履歴ファイルに保存されます。


1
他の答えは正しいです。これは間違っています。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.