bashの感嘆符(!)を理解する


108

私は使った

history | less

前のコマンドの行を取得し、左側の数字から、繰り返したい行を見つけました(例:22)

!22

コマンドプロンプトで動作し、そのときに実行した行で一連のコマンドを実行しました。感嘆符が使用されている場所、bashによって実行されるアクションの観点でそれが何を表しているのか、どこで使用するのかはわかりません。ドキュメントからは、「具体的な」説明は表示されません。


6
この答えは役立つかもしれません
マイケルMrozek

9
質問への回答ではありませんが、<ctrl> + Rを使用すると、履歴を対話形式で検索して、探しているものが見つかったらすぐに実行できます。
カステルマ

回答:


144

!これは、端末で矢印キーを使用できるようになる前に、Cシェルに最初に登場した機能です。現在のコマンド番号をプロンプト(PS1="\!$ ")に追加すると、画面をすばやく確認して過去のコマンドの番号を取得できる場合に特に便利です。

矢印キーなどを使用しCtrl-Rてコマンド履歴を検索できるようになったので、この機能の使用法はあまり見当たりません。

まだ役に立つと思われるバリアントの1つは!!、で、前のコマンドを再実行します。単独では、!!Enter単にを超える速度を見つけることはできませんが Enter、より大きなコマンドに組み合わせると便利です。

例:共通パイロットエラーsudo基づくシステムは忘れることでsudo特別な権限が必要なコマンドの接頭辞を。初心者がコマンド全体を再入力します。勤勉な学生は、シェルのコマンド履歴からコマンドを編集します。賢明な1つのタイプsudo !!

Bashでは!set +o histexpandまたはでシェルの処理を無効にできますset +H。Zshで無効にできset -Kます。


4
Ctrl-P Ctrl-Jはかなり高速です。少なくともUp Enterよりも高速です。
一時的な

24
最後のコマンドを実行したいだけの場合、Up / Enterは問題ありませんが、何らかの方法で(たとえば、忘れたsudoなど)追加したい場合は、を実行できますsudo !!。「Up / Ctrl-A(または幸運な場合はHome)/ sudo / space / enter」よりも少し速いかもしれません。YMMV。:)

1
@AquariusPower:引用してください。どちらかecho 'Hi!'またはecho "Hi!"echo Hi\!。すべて同じことをします。
ウォーレンヤング

1
setopt NO_BANG_HISTzshの中でより多くの記憶に残るかもしれません-K
グレゴリー

48

ここでこれ以上回答がない場合は、スーパーユーザーに関する質問があります。最近読んだので。では、bashのmanページ、あなたは巨大なセクションと題し見つけることができます歴史EXPANSION問題についてを。

最後のコマンド、またはコマンド番号Xを実行するだけでなく、ホスト全体!catを実行できますcat。または!?bash?:s/bash/csh/、を含む最後のコマンドを実行しますが、bashそれに置き換えcshます。


3
OPの質問への直接的な答えではありませんが、これにはさらに多くの賛成票が必要です。とても便利です!ありがとう、Havok。
malvim

ええと、グーグル検索を開始する前に、manページをよく調べる必要があります。
erikbwork

1
!!:s/bash/csh/実際に最後のコマンドを実行し、bashをcshに置き換えます(存在する場合)。bashを含む最後のコマンドではありません。それは!?bash?:s/bash/csh/多分!?bash?:s/%/csh/
cde

Bashを何年も広範囲に使用してきたので、私は以前このキーワードについて知らなかったことにショックを受けました。manページをじっと見つめていても、この機能は非常にあいまいです。関連するセクションを指摘していただきありがとうございます。実際のドキュメントでは、それが十分に説明されている唯一の場所です。
スティーブベナー

39

次のような方法でさらに多くのことができます!

  • 3つのコマンドの前に入力されたコマンドを実行します。 !-3
  • 次で始まるコマンドを実行する !ls

などなど。知っておくべき15のLinux Bash History Expansionの例を参照してください


これを支持しました。他の回答には、これらの巧妙なトリックはありませんでした。
Gergely Lukacsy

www.thegeekstuff.comは単なる素晴らしいリソースであり、これは私がこれまで見たことがなかった数少ないLinuxの記事の1つであったため、賛成しました。非常に役立ちます。
スティーブベナー

4

私の友人は私にこれを電子メールで送りました:

GNU履歴ライブラリの一部です。bashでは、履歴内のコマンドを再実行するために使用されます。筋金入りになりたい場合は、bash-4.1 / lib / readline / histexpand.cのhistory_expansion_charのgrepで実装の詳細を確認してください。


3

もちろん!!、bashシェルで最後のコマンドを再利用することもできます。そして!$、最後のコマンドの最後の部分を再利用する必要があります。

たとえば、いくつかのファイルを表示する

less path/to/your/file.txt

同じファイルを編集したい場合!$は、最後のコマンドからファイルパスのみを取得するために使用できます

vim !$

1
ああ、私はこれを見つけたいと思っていました。2つの引数でどのように動作しますか?
ジョナサン

2つの最後の引数を再利用するだけです。$touch f1 f2そして次に$vim !$評価します$vim f2
Teshan Shanuka J
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.