実行してはいけないコマンドを実行したと感じたことはありませんか?彼らは物事を台無しにして、何が起こったのかあなたを困惑させましたか? Bash の履歴コマンドを使用すると、何が問題なのかを突き止めるという頭痛の種から解放され、複雑なコマンドを再実行する時間を節約できます。
読者ではありませんか?この関連するビデオ チュートリアルをご覧ください。 ビデオが表示されない場合広告ブロッカーが無効になっていることを確認してください。このチュートリアルでは、最も役立つ Bash 履歴コマンドのいくつかを学習し、コマンドの実行を見失うことはありません。
読み進めて、Bash の歴史を救いましょう!
前提条件
このチュートリアルは実践的なデモンストレーションです。フォローしたい場合は、次のものがあることを確認してください。
- Linux マシン – このチュートリアルでは Ubuntu 20.04 を使用しますが、どの Linux ディストリビューションでも動作します。
- root 権限を持つユーザー アカウント。
Bash 履歴の表示
ほとんどの Linux ディストリビューションは、Bash をデフォルトのシェルとして使用します。他のシェル環境と同様に、Bash は以前に実行したコマンドの記録を保持します。この記録は、~/.bash_history という名前のファイルに保持されます。 システムを再起動しても。
しかし、Bash の履歴をどのように表示しますか? history
を実行する 単独でコマンドを実行するか、別のコマンドとパイプ接続します。
1. history
を実行します 以下のコマンドを実行して、コマンドの履歴を表示します。
history
以下に、現在のシェル セッションで root ユーザーが実行したコマンドの全リストを示します。デフォルトでは、コマンドは古いものから新しいものへ (上から下へ) リストに表示されます。
以下の出力は、履歴ファイル全体のほんの一部を示しています。多くの場合、何千もの履歴行が表示され、それらをスクロールするのに苦労します。ただし、読み進めると、次の手順で必要な方法で出力をカスタマイズする方法を学習できます。

2. 次に、history
を実行します 最後の 10
を表示する以下のコマンド コマンドは Bash の履歴に記録されます。 10
を置き換えます 表示したい行数で。
history 10
以下に示すように、出力ははるかに管理しやすくなっています。

3. 最後に、head
でパイプされた次のコマンドを実行します。 コマンドを使用して、現在のセッションで root ユーザーによって実行された最初の 10 個の (最も古い) コマンドのみを一覧表示します。
ステップ 2 と同様に、10 を表示したい行数に置き換えます。
history 10 | head
以下に示すように、最も古いコマンドを表示すると、セッションの開始時に実行されたコマンドを確認するときに役立ちます。

日付と時刻によるコマンドの Bash 履歴の表示
history
コマンドは便利ですが、コマンドを実行した日時は表示されません。日付と時刻の情報は、トラブルシューティングや問題の原因の特定に役立ちます。
幸いなことに、HISTTIMEFORMAT
で Bash 履歴の日付と時刻の形式を設定することで、この情報を取得できます。
以下のコマンドを実行して日付を設定します (%F
) と時刻 (%T
) Bash 履歴の形式。
%F
オプションは完全な日付で、年月日の形式で表示されます。%T
オプションは時間で、時:分:秒 (24 時間) 形式で示されます。%T
の後にスペースを追加する必要があることに注意してください コマンドから分離するオプション
HISTTIMEFORMAT='%F, %T '
形式オプションを自由に組み合わせて使用できます。たとえば、コマンドを実行した時間だけを表示したい場合は、
%T
を使用します。 .または%F
を使用します 代わりに日付のみを表示したい場合
history
を実行します コマンドだけで Bash の履歴を表示できます。
history
以下に示すように、コマンドが実行された日時が出力に含まれるようになりました。

Bash 履歴の検索
Bash の履歴を表示し、表示するコマンドの数を制御する方法を見てきました。しかし、Bash の履歴で特定のコマンドを見つけたいのですが、それが何であったかを正確に覚えていない場合はどうすればよいでしょうか? grep
などの他のコマンドのパイプ 、 history
に コマンドでうまくいきます。
以下のコマンドを実行して (grep
を収集します) ) ls
を含む Bash 履歴のコマンドの各行 text を表示し、最後の 5 つを出力します (5
) コマンド。 -i
オプションは grep
を伝えます コマンドの各行の大文字小文字を無視します。
ls
を必ず置き換えてください
デフォルトでは、grep コマンドは大文字と小文字を区別し、ファイル内の大文字と小文字の区別を示します。たとえば、「ls」を検索すると、「ls」を含むコマンドが表示されますが、「LS」や「Ls.」は表示されません。
history 5 | grep -i ls
以下では、大文字と小文字に関係なく、「 ls 」を含む最後の 5 つのコマンドが表示されていることがわかります。

イベント指定子を使用して Bash 履歴からコマンドを実行する
さまざまな出力で Bash 履歴からコマンドを表示する方法は既に知っています。しかし、すべてを再入力することなく、Bash 履歴からコマンドを実行することもできることをご存知でしたか?
この機能により、イベント指定子を使用して同じコマンドを複数回実行するときに時間を節約できます。イベント指定子を使用すると、履歴リスト内の位置によってコマンドを参照でき、複雑なコマンドを再実行するときに役立ちます。
Bash 履歴からコマンドを実行するには、感嘆符 (!
) の後に実行するコマンドの番号が続きます。
1. これまでに学んだ方法で Bash の履歴を表示します。しかし、チュートリアルは history
を実行します オプションまたはパイプ コマンドなしのコマンド。
history
以下の出力の左の列の数字は、イベント指定子と呼ばれるコマンド履歴番号です。
Bash の履歴から再実行したいコマンドの番号に注意してください。この場合は apt install sudo コマンドです。

2. 次に、次のコマンドを実行して、11 番目 (!11
) を実行します。 ) Bash 履歴からのコマンド
!11
以下では、!11 コマンドを実行して apt install sudo コマンドを実行することがわかります。

おそらく、実際にコマンドを実行する前に、コマンドをドライランしたいでしょう。その場合は、以下に示すように、ターゲット コマンドのいずれかに :p オプションを追加します。このオプションは、コマンドを再実行したときに混乱したくない場合に役立ちます。
!11:p
以下の !11:p コマンドは、実行せずに Bash 履歴からターゲット コマンドを出力することに注意してください。

3. 次のコマンドを実行します (!!
) おそらく Bash 履歴の最後のコマンドを実行したい場合。このコマンドは、誤ってコマンドを終了したり、sudo
で実行するのを忘れた場合に役立ちます。 特権。
!!
下から見れます!! command は、Bash 履歴の最後のコマンドである history 5 コマンドを実行します。

4. 次に、以下のコマンドを実行して、先頭に sudo を付けたコマンド (おそらく touch
) を再実行します。 コマンド、Bash 履歴から。 sudo
を前に付けるのを忘れた場合 前のコマンドで、この機能は root 以外のユーザーを使用している場合に役立ちます。
sudo !!

5. 最後に、以下のコマンドを実行して ping コマンドを最後のコマンドとして設定し、コマンドの名前を指定して Bash 履歴の最後のコマンドを再実行します。
この機能は、コマンド名の先頭を覚えている場合に役立ちます。そのため、Bash の履歴を表示して検索する必要はありません。
# Ping google.com
ping google.com
# Rerun the specified command (ping)
!ping
以下で、!ping コマンドが ping で始まる最新のコマンドを検索し、そのコマンドを再実行していることがわかります。

Bash 履歴からの引数の再利用
すべてを再入力せずに履歴からコマンドを再実行するのは楽しいですよね?しかし、別のコマンドの引数を使用しながら新しいコマンドを実行したい場合はどうでしょうか?この場合、!$
を使用します。 イベント指定子は、前のコマンドの最後の引数を指定するのに便利です。
前の例のように、!$
長いまたは複雑な引数を再入力せずに再利用できます。たとえば、長いパスとファイル名で新しいファイルを作成し、別のファイルに同じ名前を使用したいとします。したがって、再度入力する必要はありません。これを行うには、次のコマンドを入力します。
以下のコマンドを実行して、長いパスとファイル名を持つファイルを作成し、ファイル パス全体を再入力せずにテキスト エディターでファイルを開きます。
# Creates a file called this_is_a_long_file_name
touch /home/ata/Documents/this_is_a_long_file_name
# Expand to the last command's arguments and
# opens the this_is_a_long_file_name file in a text editor
nano !$
以下に示すように、!$
を使用して イベント指定子を使用すると、長い引数や複雑な引数を指定してコマンドを再実行する時間を大幅に節約できます。

結論
この記事では、Bash 履歴コマンドを使用して時間を節約し、生産性を向上させる方法を学びました。この時点で、特定の数のコマンドを表示し、特定のコマンドを検索し、コマンドを再実行し、Bash 履歴から引数を再利用する方法を既に知っています。
これらのスキルは、コマンド ラインで作業するときに役立ちます。それでは、Bash のショートカットを学んでこれらのスキルを構築し、コマンドライン環境での生産性を高めてみませんか?