操作履歴

導入

Bash はユーザーの操作履歴を保持します。つまり、ユーザーが入力したすべてのコマンドが記録されます。デフォルトでは、最新の 500 個のコマンドが保存されます。操作履歴を取得すると、方向キーの「↑」「↓」を使用して、前後のコマンドをすばやく参照できます。

現在のシェルを終了すると、Bash は現在のシェルでのユーザーの操作履歴を ~/.bash_history ファイルに書き込みます。このファイルにはデフォルトで 500 件の操作が保存されます。

環境変数 HISTFILE は常にこのファイルを指します。

$ エコー $HISTFILE
/home/me/.bash_history

履歴コマンド

historyコマンドは.bash_historyファイルの全内容、つまり操作履歴を出力します。

$history
...
498 エ​​コー さようなら
499ls~
500cd

ユーザーはこのコマンドを使用して、最近の操作を表示できます。 .bash_history ファイルを直接読み取る場合と比較して、すべてのコマンドの前に行番号が追加されるという利点があります。最新の操作は最後にあり、行番号が最も大きくなります。

以前に実行したコマンドを検索したい場合は、「grep」コマンドで操作履歴を検索できます。

$ 履歴 grep /usr/bin

上記のコマンドは、/usr/bin を含む .bash_history ファイル内のコマンドを返します。

history コマンドの -c パラメータは、操作履歴、つまり .bash_history ファイルをクリアできます。

$ 履歴 -c

環境変数

HISTTIMEFORMAT

環境変数 HISTTIMEFORMAT をカスタマイズすることで、history の出力に各操作の時間を表示することもできます。

$export HISTTIMEFORMAT='%F %T '
$history
1 2013-06-09 10:40:12 猫 /etc/issue
2 2013-06-09 10:40:12 クリア

上記のコードでは、%F%Y - %m - %d (年-月-日) に相当し、%T%H: %M: %S (時:分:秒)。

HISTTIMEFORMAT 環境変数が設定されている限り、コマンドの実行タイムスタンプは .bash_history ファイルに保存されます。設定しない場合、タイムスタンプは保存されません。

ヒストサイズ

環境変数 HISTSIZE は、保存される履歴操作の数を設定します。

$ エクスポート HISTSIZE=10000

上記のコマンド設定により、過去10,000件の操作履歴が保存されます。

この操作の履歴を保存したくない場合は、HISTSIZE を 0 に設定できます。

エクスポート HISTSIZE=0

ユーザーのホームディレクトリにある「~/.bashrc」ファイルに「HISTSIZE=0」を書き込むと、ユーザーの操作履歴は保持されなくなります。 /etc/profileに書き込むとシステム全体に操作履歴が残りません。

ヒスチグノア

環境変数 HISTIGNORE は、操作履歴を書き込まないコマンドを設定できます。

エクスポート HISTIGNORE='pwd:ls:exit'

上記の設定例では、「pwd」「ls」「exit」の3つのコマンドは操作履歴を書き込みません。

Ctrl + R

コマンドを入力する際に​​「Ctrl + r」ショートカットキーを押すと操作履歴を検索し、以前に実行したコマンドを選択できます。

「Ctrl + r」は、「.bash_history」ファイルの検索インターフェースを開くのと同じです。コマンドの先頭を直接入力すると、シェルが自動的にファイル内を逆方向に検索します(つまり、最新のコマンドを最初にクエリします)。その結果、この時点で Enter キーを押すと、そのコマンドが実行されます。

! 注文

+ 行番号

操作履歴の各レコードには行番号が付けられます。コマンドの行番号がわかったら、「感嘆符 + 行番号」を使用してコマンドを実行できます。 .bash_history内の8番目のコマンドを実行したい場合は、次のように実行できます。

$!8

!- 番号

このシェル会話の最後のコマンド (最後から 3 番目のコマンドなど) を実行したい場合は、「!-3」と入力できます。

$ タッチ a.txt
$タッチb.txt
$タッチc.txt

$ !-3
.txt をタッチ

上の例では、!-3 は下から 3 番目のコマンド、つまり touch a.txt を返します。

これと「! + 行番号」の主な違いは、後者は「.bash_history」ファイルの先頭から行数をカウントするのに対し、「!- 番号」は下から上に行数をカウントすることです。

###!!

!! コマンドは前のコマンドに戻ります。特定のコマンドを繰り返し実行する必要がある場合は、「!!」を入力し続けることができ、非常に便利です。これは「!-1」と同等です。

$ エコーこんにちは
こんにちは

ドル!!
エコーこんにちは
こんにちは

上の例では、!! は前のコマンド echo hello を返し、実行します。

特定のコマンドを使用すると、システムが権限がないことを示すエラーを報告することがあります。この場合は、「sudo !!」を使用できます。

# エラー、実行権限がありません
$ yum アップデート

$スドー!!
sudo yum アップデート

上記の例では、「sudo !!」は「sudo yum update」を返すので正しく実行できます。

! + 検索語

「感嘆符 + 検索語」を使用すると、一致するコマンドをすばやく実行できます。

$ エコーハローワールド
こんにちは世界

$ エコー さようなら
さようなら

$!e
エコーさようなら
さようなら

上記例の「!e」は、操作履歴から「e」で始まる最新のコマンドを見つけて実行することを意味します。 Bash は最初にコマンド「echo Goodbye」を出力し、それを直接実行します。

同様に、!echoecho で始まる最新のコマンドを実行します。

$ !エコー
エコーさようなら
さようなら

$ !エコーH
エコー さよならH
さようならH

$ !エコー H G
エコー さようなら H G
さようなら、H G

「感嘆符 + 検索語」の構文はコマンドのみに一致し、パラメータには一致しないことに注意してください。したがって、!echo H は、echo Hello World を実行するのではなく、echo Goodbye を実行し、パラメータ H をこのコマンドに追加します。同様に、「!echo H G」は、「echo Goodbye」コマンドの後に「H G」を追加するのと同じです。

「感嘆符 + 検索語」は以前に実行したコマンドに展開されるため、「!」を含む文字列は二重引用符で囲む必要があります。その後にスペース以外の文字がある場合は、エラーが報告される可能性があります。 。

$ echo "私は言います:\"こんにちは!\""
bash: !\: イベントが見つかりません

上記のコマンドは、感嘆符の後にバックスラッシュがあるため、バックスラッシュで始まるコマンドが以前に実行されたかどうかを検索しようとします。それが見つからない場合は、エラーが報告されます。解決策は、感嘆符の前にバックスラッシュを追加することです。

$ echo "私は言います:\"こんにちは\!\""
私は言います:「こんにちは!」

!? + 検索語

「!? + 検索語」は、パラメータ部分を含むコマンドの任意の部分を検索できます。これと「! + 検索語」の主な違いは、後者は行の先頭から一致を開始することです。

$ 猫こんにちは.txt
こんにちは世界..!

$ !?hello.txt
猫こんにちは.txt
こんにちは世界..!

上の例では、!?hello.txt は、hello.txt を含む最新のコマンドを返します。

!$、!*

!$ は前のコマンドの最後のパラメータを表し、別の書き方は $_ です。

!* は前のコマンドのすべてのパラメータ、つまりコマンドを除くすべての部分を表します。

$ cp a.txt b.txt
$エコー!$
b.txt

$ cp a.txt b.txt
$エコー!*
a.txt b.txt

上記の例では、!$ は前のコマンド (b.txt) の最後のパラメータを表し、!* は前のコマンド (a.txt b.txt) のすべてのパラメータを表します。

前のコマンドの特定の位置にある引数と一致させたい場合は、「!:n」を使用します。

$ ls a.txt b.txt c.txt

$ エコー !:2
b.txt

上の例では、!:2 は前のコマンド (b.txt) の 2 番目のパラメータを返します。

このように書かれた !:$ は、前のコマンドの最後のパラメータを表します。実際、!$!:$ の省略形です。

$ ls a.txt b.txt c.txt

$ エコー !:$
エコーc.txt
c.txt

上の例では、!:$ は前のコマンド (c.txt) の最後のパラメータを表します。

前のコマンドよりも古いコマンドのパラメータと一致させたい場合は、!<command>:n (指定された位置のパラメータ) と !<command>:$ (最後のパラメータ) を使用できます。

$ ls !mkdir:$

上の例では、!mkdir:$ は最後の mkdir コマンドの最後のパラメータを返します。

$ ls !mk:2

上の例では、!mk:2 は、mk で始まる最後のコマンドの 2 番目のパラメータを返します。

!:p

前のコマンドを実行せずに出力だけしたい場合は、 !:p を使用できます。

$ エコーこんにちは

$ !:p
エコーこんにちは

上の例では、!:pecho hello を出力するだけで、このコマンドは実行されません。

最後に一致したコマンドを実行せずに出力したい場合は、!<command>:p を使用できます。

$ !su:p

上記の例では、!su:p は、su で始まる最新のコマンドを実行せずに出力します。

^文字列1^文字列2

^string1^string2 は、string1 を含む最新のコマンドを実行し、それを string2 に置き換えるために使用されます。

$ rm /var/log/httpd/error.log
$^エラー^アクセス
rm /var/log/httpd/access.log

上記の例では、^error^access は、error を含む最新のコマンドの erroraccess に置き換えます。

histverify パラメータ

上記のショートカット コマンド (「!!」 コマンドなど) は、一致するコマンドが見つかった直後に実行されます。確認ステップを追加したい場合は、最初にコマンドを出力し、実行する前にユーザーに確認してもらいます。シェルの histverify オプションをオンにできます。

$ shopt -s histverify

「histverify」オプションをオンにすると、「!」ショートカット キーを使用して返されたコマンドが最初に出力され、ユーザーが Enter キーを押した後に実行されます。

ショートカット キー

その他、行動履歴に関するショートカットキーをいくつか紹介します。

  • Ctrl + p: 前のコマンドを表示します。これは上矢印 (前) と同じ効果があります。
  • Ctrl + n: 次のコマンドを表示します。これは、下矢印 (next) と同じ効果があります。
  • Alt + <: 最初のコマンドを表示します。
  • Alt + >: 最後のコマンド、つまり現在のコマンドを表示します。
  • Ctrl + o: 履歴ファイルの現在のエントリを実行し、次のコマンドを自動的に表示します。これは、一連のコマンドを繰り返し実行する場合に役立ちます。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0