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

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

使った

history | less

前のコマンドの行と左の数字で繰り返したい行(例:22)を見つけて実行しました。

!22

コマンドプロンプトでは、私が実行していた行から一連のコマンドを実行しました。感嘆符がどこで使用されているのか、bashがどのようなアクションをとるのか、どこで使用するのかわかりません。ドキュメントに「実質的な」説明が表示されません。

答え1

!通話履歴の拡張、この機能はもともと以下で登場しました。Cシェル、端末に矢印キーがあると信じられなかった時代。これは、現在のコマンド番号をプロンプト(PS1="\!$ ")に追加して、過去のコマンドの番号を画面にすばやく表示できる場合に特に便利です。

これで、方向キーや検索コマンドの履歴Ctrl-Rなどを使用できますが、その機能はあまり役に立たないようです。

!!前のコマンドを再実行するこの便利なバリエーションがまだ見つかります。それ自体では、!!Enterコマンドがより高速であることがわかりませんでしたが、 Enterより大きなコマンドに組み合わせると役に立ちます。

例:ノーマルパイロットエラー存在するsudoシステムベースのアプローチは、sudo追加の権限が必要なコマンドの前にプレフィックスを付けることを忘れてしまうことです。初心者の場合は、コマンド全体を再入力してください。勤勉な学生は、シェルのコマンド履歴からコマンドを編集します。啓発型sudo !!

このタイプの処理は、対話型シェルのBashでデフォルトで有効になっており、有効または無効に!できます。 Zshを使用して無効にすることができます。set +o histexpandset +Hset -K

答え2

ここに長い回答がない場合は、最近読んだため、SuperUserに対する回答が必要です。内部にバッシュのマニュアルページ次のような大きなセクションがあります。歴史的拡張この問題では。

最後のコマンドまたはコマンド番号Xを実行する代わりに、ホスト全体で操作を実行できます。!catで始まる最後のコマンドを実行するなどの操作を実行できますcat。または含まれていますが、に置き換える!?bash?:s/bash/csh/最後のコマンドを実行します。bashcsh

答え3

!次のように、はるかに多くの作業を実行できます。

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

もっとあります。バラよりあなたが知っておくべき15のLinuxバッシュレコード拡張の例

答え4

私の友人が私に次のようなメールを送信しました。

GNU歴史図書館の一部です。 Bashでは、履歴のコマンドを再実行するために使用されます。ハードコアになりたい場合は、bash-4.1/lib/readline/histexpand.cでHistory_expansion_charをgrepして実装の詳細を確認してください。

関連情報