Linux のシェルには実行したコマンドの履歴が保存され、それを検索して過去に実行したコマンドを繰り返すことができます。 Linux の履歴コマンドとその使用方法を理解すると、生産性が大幅に向上します。
Linux コマンド履歴は何に使用されますか?
Linux の
history
コマンドを使用すると、以前のコマンドを確認して繰り返すことができます。これは単に怠惰を奨励したり時間を節約したりすることを目的としたものではありません。効率 (および正確さ) という要素も考慮されています。コマンドが長く複雑になればなるほど、覚えて間違いなく入力することが難しくなります。エラーには 2 種類あります。1 つはコマンドの動作を妨げるエラーで、もう 1 つはコマンドの動作は許可しますが、予期しない動作をさせるエラーです。
history
コマンドを使用すると、これらの問題が解決されます。ほとんどの Linux コマンドと同様に、
これにはあなたが思っている以上の機能があります
。ただし、
history
コマンドの使用方法を学べば、Linux コマンド ラインの使い方を毎日向上させることができます。それは良い時間の投資です。
history
コマンドを使用するには、
上矢印を繰り返し押す
よりもはるかに優れた方法があります。
履歴コマンド
最も単純な形式では、名前を入力するだけで
history
コマンドを使用できます。
歴史
以前に使用したコマンドのリストがターミナル ウィンドウに書き込まれます。
コマンドには番号が付けられており、最近使用したもの (番号が最も大きいもの) がリストの最後にあります。
特定の数のコマンドを表示するには、コマンド ラインで
history
に数値を渡すことができます。たとえば、最近使用した 10 個のコマンドを表示するには、次のように入力します。
歴史10
tail
コマンド
を使用して
history
パイプする
と、同じ結果が得られます。これを行うには、次のように入力します。
歴史 |尾部 -n 10
コマンドの繰り返し
履歴リストのコマンドを再利用する場合は、感嘆符 (!) とコマンドの番号を間にスペースを入れずに入力します。
たとえば、コマンド番号 37 を繰り返すには、次のコマンドを入力します。
!37
最後のコマンドを繰り返すには、スペースを入れずに 2 つの感嘆符をもう一度入力します。
!!
これは、コマンドを発行して
sudo
使用するのを忘れた場合に便利です。
sudo
、スペース 1 つ、感嘆符 2 つを入力し、Enter キーを押します。
次の例では、
sudo
必要とするコマンドを入力しました。行全体を再入力する代わりに、多数のキーストロークを保存して
sudo !!
、以下に示すように:
mv ./my_script.sh /usr/local/bin/
須藤!!
したがって、リストから対応する番号を入力してコマンドを繰り返すか、二重感嘆符を使用して最後に使用したコマンドを繰り返すことができます。ただし、5 番目または 8 番目のコマンドを繰り返したい場合はどうすればよいでしょうか?
感嘆符 1 つ、ハイフン (-)、および前のコマンドの番号 (ここでもスペースは含まれません) を使用して、コマンドを繰り返すことができます。
前の 13 番目のコマンドを繰り返すには、次のように入力します。
!-13
文字列によるコマンドの検索
特定の文字列で始まる最後のコマンドを繰り返すには、感嘆符を入力し、次にスペースを含まない文字列を入力して、Enter キーを押します。
たとえば、
sudo
で始まる最後のコマンドを繰り返すには、次のコマンドを入力します。
!sudo
ただし、これには危険な要素があります。
sudo
で始まる最後のコマンドがあなたが思っているものと異なる場合、間違ったコマンドを起動することになります。
ただし、セーフティ ネットを提供するには、以下に示すように :
:p
(print) 修飾子を使用できます。
!sudo:p
これは、コマンドを実行するのではなく、ターミナル ウィンドウに出力するように
history
に指示します。これにより、コマンドを使用する前にそのコマンドを確認できます。必要なコマンドの場合は、上矢印を押して Enter キーを押して使用します。
特定の文字列を含むコマンドを検索する場合は、感嘆符と疑問符を使用できます。
たとえば、「aliases」という単語を含む最初に一致するコマンドを検索して実行するには、次のコマンドを入力します。
!?エイリアス
これにより、文字列内のどこに出現するかに関係なく、文字列「aliases」を含むコマンドが検索されます。
インタラクティブな検索
対話型検索により、一致するコマンドのリストを移動して、必要なコマンドを繰り返すことができます。
Ctrl+r を押すだけで検索が開始されます。
検索の手がかりを入力すると、最初に一致したコマンドが表示されます。入力する文字は、バックティック (`) とアポストロフィ (‘) の間に表示されます。各文字を入力すると、一致するコマンドが更新されます。
Ctrl+r を押すたびに、次の一致するコマンドが逆方向に検索され、ターミナル ウィンドウに表示されます。
Enter キーを押すと、表示されたコマンドが実行されます。
コマンドを実行する前に編集するには、左矢印キーまたは右矢印キーを押します。
コマンドがコマンド ラインに表示され、編集できます。
他の Linux ツールを使用して履歴リストを検索できます。たとえば、
history
からの出力を
grep
にパイプし、
文字列「aliases」を含むコマンドを検索するには、
次のコマンドを使用します。
歴史 | grep エイリアス
最後のコマンドの変更
タイプミスを修正してコマンドを繰り返す必要がある場合は、キャレット (^) を使用して変更できます。これは、コマンドのスペルを間違えた場合や、別のコマンド ライン オプションやパラメータを使用してコマンドを再実行したい場合に備えて、非常に便利なテクニックです。
これを使用するには、キャレット、置換するテキスト、別のキャレット、置換するテキスト、別のキャレットを (スペースなしで) 入力し、Enter キーを押します。
たとえば、次のコマンドを入力し、誤って「sshd」ではなく「shhd」と入力したとします。
sudo systemctl start shhd
次のように入力すると、これを簡単に修正できます。
^しっしっ^しっしっ^
コマンドは「shhd」を「sshd」に修正して実行されます。
履歴リストからコマンドを削除する
-d
(削除) オプションを使用して、履歴リストからコマンドを削除することもできます。スペルを間違えたコマンドを履歴リストに残しておく必要はありません。
grep
を使用してそれを見つけ、
-d
オプションを使用してその番号を
history
に渡して削除し、再度検索してそれがなくなっていることを確認します。
歴史 | grep shhd
歴史 -d 83
歴史 | grep shhd
-d
オプションに一連のコマンドを渡すこともできます。 22 から 32 (両端を含む) までのすべてのリスト エントリを削除するには、次のコマンドを入力します。
歴史 -d 22 32
最後の 5 つのコマンドのみを削除するには、次のように負の数を入力します。
履歴 -d -5
履歴ファイルを手動で更新する
ログインするかターミナル セッションを開くと、履歴リストが履歴ファイルから読み込まれます。 Bash では、デフォルトの履歴ファイルは
.bash_history
です。
現在のターミナル ウィンドウ セッションで行った変更は、ターミナル ウィンドウを閉じるかログアウトするときにのみ履歴ファイルに書き込まれます。
別の端末ウィンドウを開いて、最初の端末ウィンドウで入力したコマンドを含む完全な履歴リストにアクセスするとします。
-a
(all) オプションを使用すると、2 番目の端末ウィンドウを開く前に、最初の端末ウィンドウでこれを行うことができます。
これを使用するには、次のように入力します。
歴史-a
コマンドはサイレントに履歴ファイルに書き込まれます。
履歴リストへのすべての変更を履歴ファイルに書き込みたい場合 (たとえば、いくつかの古いコマンドを削除した場合)、次のように
-w
(書き込み) オプションを使用できます。
歴史 -w
履歴リストをクリアする
履歴リストからすべてのコマンドをクリアするには、次のように
-c
(クリア) オプションを使用します。
履歴 -c
さらにこれらの変更を履歴ファイルに強制したい場合は、次のように
-w
オプションを使用します。
歴史 -w
セキュリティと履歴ファイル
コマンド ラインに機密情報 (パスワードなど) を入力する必要があるアプリケーションを使用する場合、これも履歴ファイルに保存されることに注意してください。特定の情報を保存したくない場合は、次のコマンド構造を使用して、その情報を履歴リストからすぐに削除できます。
特別なアプリの秘密のパスワード;履歴 -d $(履歴 1)
歴史5
この構造には、セミコロン (;) で区切られた 2 つのコマンドが含まれています。これを詳しく見てみましょう:
- special-app : 使用しているプログラムの名前。
- my-secret-password : コマンドラインでアプリケーションに指定する必要があるシークレットパスワード。これでコマンド 1 は終了です。
-
History -d
: コマンド 2 では、
historyの-d(削除) オプションを呼び出します。削除するものは、コマンドの次の部分にあります。 -
$(history 1)
: これはコマンド置換を使用します。
$()に含まれるコマンドの部分はサブシェルで実行されます。その実行結果は、元のコマンドのテキストとしてポストされます。history 1コマンドは、前のコマンドを返します。したがって、2 番目のコマンドは、history -d “last command here” と考えることができます。
history 5
コマンドを使用すると、パスワードを含むコマンドが履歴リストから削除されたことを確認できます。
ただし、これを行うためのさらに簡単な方法があります。 Bash はデフォルトでスペースで始まる行を無視するため、次のように行の先頭にスペースを含めるだけです。
専用アプリ別パスワード
歴史5
パスワードが設定されたコマンドは履歴リストに追加されません。このトリックが機能する理由は、
.bashrc
ファイル内に含まれています。
.bashrc ファイル
.bashrc
ファイルは、ログインするたび、またはターミナル ウィンドウを開くたびに実行されます。また、
history
コマンドの動作を制御するいくつかの値も含まれています。
このファイルを
gedit
で編集し
ましょう。
次のように入力します。
gedit .bashrc
ファイルの先頭付近に、次の 2 つのエントリが表示されます。
-
HISTSIZE: 履歴リストに含めることができるエントリの最大数。 -
HISTFILESIZE: 履歴ファイルに含めることができる行数の制限。
これら 2 つの値は次のように相互作用します。
-
ログインするか、ターミナル ウィンドウ セッションを開始すると、
.bash_historyファイルから履歴リストが設定されます。 -
ターミナル ウィンドウを閉じると、
HISTSIZEに設定された最大数のコマンドが.bash_historyファイルに保存されます。 -
histappendシェル オプションが有効な場合、コマンドは.bash_historyに追加されます。histappendが設定されていない場合、.bash_historyは上書きされます。 -
履歴リストのコマンドを
.bash_historyに保存すると、履歴ファイルはHISTFILESIZE行以下になるように切り詰められます。
また、ファイルの先頭近くに、
HISTCONTROL
値のエントリが表示されます。
この値を設定して、次のいずれかを実行できます。
-
ignorespaces :スペースで始まる行は履歴リストに追加されません。 -
ignoredups :重複したコマンドは履歴ファイルに追加されません。 -
ignoreboth :上記の両方を有効にします。
履歴リストに追加したくない特定のコマンドをリストすることもできます。これらをコロン (:) で区切って引用符 (“…”) で囲みます。
この構造に従って
.bashrc
ファイルに行を追加し、無視したいコマンドを置き換えます。
エクスポート HISTIGNORE="ls:history"
タイムスタンプの使用
履歴リストにタイムスタンプを追加したい場合は、
HISTIMEFORMAT
設定を使用できます。これを行うには、次のような行を
.bashrc
ファイルに追加するだけです。
エクスポート HISTTIMEFORMAT="%c "
閉じ引用符の前にスペースがあることに注意してください。これにより、タイムスタンプがコマンド リスト内のコマンドと一致することがなくなります。
ここで、history コマンドを実行すると、日付とタイムスタンプが表示されます。タイムスタンプを追加する前に履歴リストにあったコマンドには、タイムスタンプを受け取った最初のコマンドの日付と時刻がタイムスタンプとして記録されることに注意してください。以下に示すこの例では、これはコマンド 118 でした。
とても長いタイムスタンプです。ただし、
%c
以外のトークンを使用して調整することもできます。使用できる他のトークンは次のとおりです。
-
%d: 日 -
%m: 月 -
%y: 年 -
%H: 時間 -
%M: 分 -
%S: 秒 -
%F: 完全な日付(年-月-日形式) -
%T: 時刻 (時:分:秒の形式) -
%c: 完全な日付とタイムスタンプ (日-日-月-年、および時:分:秒の形式)
いくつかの異なるトークンを実験して使用してみましょう。
エクスポート HISTTIMEFORMAT="%dn%m %T "
出力では日、月、時刻が使用されます。
ただし、日と月を削除すると、時刻だけが表示されます。
HISTIMEFORMAT
に加えた変更は、履歴リスト全体に適用されます。これは、各コマンドの時間が
Unix エポックからの秒数
として保存されるため可能です。
HISTTIMEFORMAT
ディレクティブは、その秒数を人間が判読できるスタイルにレンダリングするために使用される形式を次のように指定するだけです。
エクスポート HISTTIMEFORMAT="%T "
出力はより管理しやすくなりました。
history
コマンドを使用して監査することもできます。過去に使用した
コマンド
を確認すると、問題の原因を特定するのに役立つ場合があります。
日常生活と同じように、Linux でも、
history
コマンドを使用して、良い時代を追体験し、悪い時代から学ぶことができます。





