web-dev-qa-db-ja.com

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

使った

history | less

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

!22

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

112
Vass

!は、元々は Cシェル に表示されていた機能で、端末で矢印キーを使用できるようになる前の時代にさかのぼります。プロンプト(PS1="\!$ ")に現在のコマンド番号を追加すると、画面をすばやく見て過去のコマンドの番号を取得できるので特に便利です。

矢印キーと次のようなものを使用できるようになりました Ctrl-R コマンド履歴を検索するために、この機能をあまり使用していません。

それでも便利だと思われるその1つのバリエーションは、前のコマンドを再実行する!!です。それだけでは見つけられません !!Enter ただより速い Enterですが、より大きなコマンドに組み合わせると役立ちます。

例:Sudo ベースのシステムで一般的な パイロットエラー は忘れることです追加の特権を必要とするコマンドのSudo接頭辞。初心者はコマンド全体を再入力します。勤勉な学生は、シェルのコマンド履歴からコマンドを編集します。悟りを開いた人はSudo !!をタイプします。

Bashでは、!またはset +o histexpandを使用して、シェルでset +H処理を無効にすることができます。 Zshでset -Kを使用して無効にできます。

157
Warren Young

ここでより長い回答がない場合、私は最近読んだので、スーパーユーザーには確かに1つあります。 bashのマニュアルページ には、HISTORY EXPANSIONというタイトルの大きなセクションがあります。

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

52
Cry Havok

次のような!を使用すると、さらに多くのことができます。

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

そしてもっとたくさん。参照 知っておくべき15のLinux Bash履歴拡張の例

40
user379997

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

例えばファイルを表示

less path/to/your/file.txt

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

vim !$

編集:

前のコマンドのすべての引数を!*で使用できます

例:これはいくつかのファイルを作成し、それらすべてを削除します

$ touch a.txt b.txt c.txt d.txt
$ rm !*

繰り返しますが、前のコマンドの特定の引数を使用できます

例えばこれにより4つのファイルが作成され、3番目のファイル(c.txt)が削除されます

$ touch a.txt b.txt c.txt d.txt
$ rm !:3

同様に、最後のコマンドの引数の範囲を次のように使用できます

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4

これは、式をrm b.txt c.txt d.txtに評価する引数2〜4を再利用します

6

私の友人はこれを私にメールしました:

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

4
Vass