LinuxVPSでBash履歴コマンドと拡張を使用する方法
序章
サーバー環境で作業している間は、コマンドラインに多くの時間を費やします。 ほとんどの場合、ほとんどのディストリビューションのデフォルトであるbashシェルを使用します。
ターミナルセッション中は、いくつかのコマンドを頻繁に繰り返し、それらのコマンドのバリエーションをさらに頻繁に入力する可能性があります。 最初は各コマンドを繰り返し入力することをお勧めしますが、ある時点で、それは一線を越えて混乱を招き、煩わしくなります。
幸いなことに、bashシェルにはかなりよく開発された履歴関数がいくつかあります。 bash履歴を効果的に使用および操作する方法を学ぶことで、入力に費やす時間を減らし、実際の作業を行うためにより多くの時間を費やすことができます。 多くの開発者は、 Do n’t RepeatYourselfのDRY哲学に精通しています。 bashの履歴を効果的に使用すると、この原則に近い操作が可能になり、ワークフローが高速化されます。
前提条件
このガイドに従うには、Linuxベースのオペレーティングシステムを実行しているコンピューターにアクセスする必要があります。 これは、SSHで接続した仮想プライベートサーバーまたはローカルマシンのいずれかです。 このチュートリアルは、Ubuntu 20.04を実行しているLinuxサーバーを使用して検証されていますが、示されている例は、任意のバージョンのLinuxディストリビューションを実行しているコンピューターで機能するはずです。
このガイドに従うためにリモートサーバーを使用する場合は、最初に初期サーバーセットアップガイドを完了することをお勧めします。 そうすることで、sudo
権限を持つroot 以外のユーザーや、UFWで構成されたファイアウォールなどの安全なサーバー環境がセットアップされます。これを使用してLinuxスキルを構築できます。
または、このページに埋め込まれているインタラクティブ端末を使用して、このチュートリアルのサンプルコマンドを試すこともできます。 次のインタラクティブターミナルを起動します!ボタンをクリックしてターミナルウィンドウを開き、Linux(Ubuntu)環境での作業を開始します。
履歴のデフォルトの設定
コマンド履歴を実際に使用する前に、いくつかのbash設定を調整してより便利にすることが役立つ場合があります。 これらの手順は必須ではありませんが、以前に実行したコマンドを簡単に見つけて実行できるようになります。
Bashを使用すると、履歴に保存するコマンドの数を調整できます。 実際には、これには2つの個別のオプションがあります。HISTFILESIZE
パラメーターは履歴ファイルに保持されるコマンドの数を構成し、HISTSIZE
は現在のセッションのメモリに保存される数を制御します。
これは、現在のセッションのメモリ内の履歴のサイズに適切な上限を設定し、後で調べることができるさらに大きな履歴をディスクに保存できることを意味します。 デフォルトでは、bashはこれらのオプションに非常に控えめな値を設定しますが、これらを拡張して、より大きな履歴を利用することができます。 一部のディストリビューションでは、デフォルトのbash履歴設定が、わずかに寛大な値ですでに増加しています。
これらの設定を変更するには、お好みのテキストエディタで~/.bashrc
ファイルを開きます。 ここでは、nano
を使用します。
- nano ~/.bashrc
HISTSIZE
とHISTFILESIZE
の両方のパラメーターを検索します。 設定されている場合は、値を自由に変更してください。 これらのパラメータがファイルにない場合は、ここで追加してください。 このガイドでは、10000行をディスクに保存し、最後の5000行をメモリにロードすると正常に機能します。 これはほとんどのシステムで控えめな見積もりですが、パフォーマンスへの影響に気付いた場合は、これらの数値を調整できます。
. . .
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=5000
HISTFILESIZE=10000
. . .
デフォルトでは、bashは各セッションの終了時に履歴を書き込み、既存のファイルを更新されたバージョンで上書きします。 これは、複数のbashセッションでログインしている場合、最後に終了したセッションのみが履歴を保存することを意味します。
これを回避するには、histappend
設定を設定します。これにより、履歴が上書きされる代わりに追加されます。 これはすでに設定されている可能性がありますが、設定されていない場合は、次の行を追加してこれを有効にできます。
. . .
shopt -s histappend
. . .
各セッションの終了を待つのではなく、bashにコマンドをすぐに履歴に追加させたい場合(ある端末のコマンドを別の端末ですぐに利用できるようにするため)、history -a
を設定または追加することもできます。 PROMPT_COMMAND パラメーターへのコマンド。このパラメーターには、新しい各コマンドプロンプトの前に実行されるコマンドが含まれています。
これを正しく構成するには、bashのPROMPT_COMMAND
をカスタマイズして、コマンドが履歴ファイルと現在のシェルセッションのメモリに記録される方法を変更する必要があります。
- まず、
history -a
を使用して履歴ファイルにすぐに追加する必要があります。 - 次に、
history -c
を使用してシェルセッションの現在の履歴をクリアする必要があります。 - 最後に、更新された履歴をシェルセッションにロードして戻すには、
history -r
コマンドを使用します。
これらすべてのコマンドをPROMPT_COMMAND
シェル変数に順番にまとめると、次のようになり、.bashrc
ファイルに貼り付けることができます。
. . .
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
. . .
終了したら、ファイルを保存して終了します。 .bashrc
ファイルをnano
で編集した場合は、CTRL + X
、Y
、ENTER
の順に押して編集します。
変更を実装するには、ログアウトして再度ログインするか、次のコマンドを実行してファイルをsource
します。
- source ~/.bashrc
これで、シェルがコマンド履歴を処理する方法を調整しました。 これで、history
コマンドを使用して以前のコマンドを見つける練習をすることができます。
以前のBash履歴を確認する
bashの履歴を確認する方法は、history
コマンドを使用することです。 これにより、最近のコマンドが1行に1つずつ出力されます。 これにより、最大でHISTSIZE
変数に選択した行数が出力されます。 この時点ではおそらく少なくなります。
- history
Output . . .
43 man bash
44 man fc
45 man bash
46 fc -l -10
47 history
48 ls -a
49 vim .bash_history
50 history
51 man history
52 history 10
53 history
history
が返す各コマンドは、簡単に参照できるように番号に関連付けられています。 このガイドでは、これがどのように役立つかについては後で説明します。
コマンドの後に番号を指定すると、出力を切り捨てることができます。 たとえば、最後に実行された5つのコマンドのみを返したい場合は、次のように入力できます。
- history 5
Output 50 history
51 man history
52 history 10
53 history
54 history 5
特定の文字列を含むすべてのhistory
コマンドを検索するには、結果をgrep
コマンドにパイプして、各行で特定の文字列を検索します。 たとえば、次のように入力して、cd
のある行を検索できます。
- history | grep cd
Output 33 cd Pictures/
37 cd ..
39 cd Desktop/
61 cd /usr/bin/
68 cd
83 cd /etc/
86 cd resolvconf/
90 cd resolv.conf.d/
以前に実行したコマンドのリストを取得できると便利な場合が多くあります。 これらのコマンドの1つを再度実行する場合は、出力からコマンドの1つをコピーして、プロンプトに貼り付けることが本能である可能性があります。 これは機能しますが、bashには、履歴からコマンドを取得して自動的に実行できるようにするショートカットがいくつか付属しています。
Bash履歴からコマンドを実行する
コマンド履歴を印刷すると便利な場合がありますが、参照として以外にこれらのコマンドにアクセスするのに実際には役立ちません。
history
操作によって返されたコマンドは、感嘆符(!
)が前に付いた番号で呼び出してすぐに実行できます。 history
の結果が前のセクションの結果と一致していると仮定すると、次のように入力することで、history
コマンドのマニュアルページをすばやく確認できます。
- !51
これにより、履歴番号51に関連付けられたコマンドがすぐに呼び出されて実行されます。
!-n
構文を使用して、現在の位置に関連するコマンドを実行することもできます。ここで、「n」は、呼び出したい前のコマンドの数に置き換えられます。
例として、次の2つのコマンドを実行したとします。
- ls /usr/share/common-licenses
- echo hello
最新のコマンド(ls
コマンド)の前に実行したコマンドを呼び出して実行する場合は、!-2
と入力します。
- !-2
最後に実行したコマンドを再実行するには、!-1
を実行できます。 ただし、bashは、最新のコマンドを置き換えて実行する2つの感嘆符で構成されるショートカットを提供します。
- !!
多くの人がコマンドを入力するときにこれを使用しますが、コマンドを実行するためにsudo
特権が必要であることを忘れていました。 sudo !!
と入力すると、コマンドの前にsudo
が表示されてコマンドが再実行されます。
- touch /etc/hello
Outputtouch: cannot touch `/etc/hello': Permission denied
- sudo !!
Outputsudo touch /etc/hello
[sudo] password for sammy:
これは、この構文の別の特性を示しています。これらのショートカットは純粋な置換であり、他のコマンドに自由に組み込むことができます。
Bashの履歴をスクロールする
bashの履歴をスクロールして、連続する各コマンドをコマンドラインに配置して編集する方法はいくつかあります。
これを行う最も一般的な方法は、コマンドプロンプトで上矢印キーを押すことです。 上矢印キーをさらに押すたびに、コマンドライン履歴に戻ることができます。
反対方向に進む必要がある場合は、下矢印キーで履歴を反対方向に移動し、最終的に現在の空のプロンプトに戻ります。
手を矢印キーまで動かすのが面倒だと思われる場合は、CTRL + P
の組み合わせを使用してコマンド履歴を後方に移動し、CTRL + N
の組み合わせを使用して前方に移動できます。再び歴史。
現在のコマンドプロンプトに戻る場合は、META + >
を押してください。 ほとんどの場合、「メタ」キーはALT
キーであるため、META + >
はALT + SHIFT + .
を押すことを意味します。 これは、自分の履歴をはるかに遡り、空のプロンプトに戻りたい場合に便利です。
反対の操作を行ってMETA + <
と入力することにより、コマンド履歴の最初の行に移動することもできます。 これは通常、ALT + SHIFT + ,
を押すことを意味します。
要約すると、これらは、履歴をスクロールしていずれかの端にジャンプするために使用できるいくつかのキーとキーの組み合わせです。
UP arrow key
:履歴を逆方向にスクロールしますCTRL + P
:履歴を逆方向にスクロールしますDOWN arrow key
:履歴を前方にスクロールCTRL + N
:履歴を前方にスクロールALT + SHIFT + .
:履歴の最後にジャンプします(最新)ALT+ SHIFT + ,
:履歴の先頭にジャンプします(最も遠い)
Bashの履歴を検索する
history
コマンドをgrep
にパイプすることは、結果を絞り込むための便利な方法ですが、多くの状況では理想的ではありません。
Bashには、その履歴の検索機能が含まれています。 これを使用する一般的な方法は、CTRL + R
キーの組み合わせを使用して、履歴をさかのぼって検索することです(最新の結果が最初に返されます)。
たとえば、CTRL + R
と入力して、前のコマンドの一部の入力を開始できます。 コマンドの一部を入力するだけです。 代わりに不要なコマンドと一致する場合は、CTRL + R
をもう一度押して次の結果を得ることができます。
誤って目的のコマンドを渡した場合は、CTRL + S
と入力して反対方向に移動できます。 これは、前のセクションのキーを使用して履歴の別のポイントに移動し、前方に検索したい場合にも役立ちます。
多くの端末では、CTRL + S
の組み合わせが、端末セッションを一時停止するようにマップされていることに注意してください。 これにより、CTRL + S
をbashに渡そうとする試みがすべて傍受され、端末が「フリーズ」します。 フリーズを解除するには、CTRL + Q
と入力してセッションの一時停止を解除します。
この一時停止および再開機能は、最近のほとんどの端末では必要ありません。次のコマンドを実行することで、問題なくオフにできます。
- stty -ixon
stty
は、コマンドラインから端末の設定を変更できるユーティリティです。 このstty -ixon
コマンドを~/.bashrc
ファイルの最後に追加して、この変更を永続的にすることもできます。
ここでもう一度CTRL + S
で検索しようとすると、期待どおりに機能し、前方に検索できるようになります。
コマンドの一部を入力した後の検索
自分自身を見つける一般的なシナリオは、コマンドの一部を入力することです。その後、コマンドを以前に実行したことがあり、履歴を検索できることに気づきます。
コマンドラインに既にあるものを使用して検索する正しい方法は、カーソルをCTRL + A
で行の先頭に移動し、CTRL + R
で逆履歴を呼び出し、現在の行をに貼り付けることです。 CTRL + Y
で検索し、CTRL + R
をもう一度使用して逆に検索します。
たとえば、Ubuntuシステムでパッケージキャッシュを更新するとします。 最近これを入力しましたが、プロンプトでsudo
をもう一度入力するまで、そのことについては考えていませんでした。
- sudo
この時点で、これは過去1日ほどで確実に実行した操作であることがわかります。 CTRL + A
を押すと、カーソルを行の先頭に移動できます。 次に、CTRL + R
を押して、逆増分履歴検索を呼び出します。 これには、カーソル位置の後にあるコマンドラインのすべてのコンテンツをコピーしてクリップボードに入れるという副作用があります。
次に、CTRL + Y
を押して、コマンドラインからコピーしたコマンドセグメントを検索に貼り付けます。 最後に、CTRL + R
を押して履歴をさかのぼり、貼り付けたばかりのコンテンツを含むコマンドを検索します。
このようなショートカットを使用することは、最初は面倒に思えるかもしれませんが、慣れると非常に便利です。 複雑なコマンドの半分を入力した位置にいて、残りを完了するには履歴が必要であることがわかっている場合に非常に役立ちます。
これらを個別のキーの組み合わせとして考えるのではなく、単一の複合操作として考えると役立つ場合があります。 CTRL
キーを押したまま、A
、R
、Y
、R
キーを続けて押すだけです。 。
より高度な履歴拡張に精通する
このガイドでは、bashが提供する最も基本的な履歴拡張手法のいくつかにすでに触れています。 これまでに取り上げたもののいくつかは次のとおりです。
!!
:最後のコマンドに展開します!n
:履歴番号「n」のコマンドを展開します。!-n
:履歴内の現在のコマンドの前に「n」個のコマンドであったコマンドに展開します。
イベント指定子
上記の3つの例は、イベント指定子のインスタンスです。 これらは通常、特定の基準を使用して以前の履歴コマンドを呼び出す方法です。 これらは、使用可能な操作の選択部分です。
たとえば、次のように入力して、最後に実行したssh
コマンドを実行できます。
- !ssh
これにより、コマンド履歴でssh
で始まる行が検索されます。 コマンドの先頭にない文字列を検索する場合は、?
文字で囲むことができます。 たとえば、前のapt-cache search
コマンドを繰り返すには、次のコマンドを実行して、コマンドを見つけて実行することができます。
- !?search?
試すことができる別のイベント指定子には、最後のコマンド内の文字列を別の文字列に置き換えることが含まれます。 これを行うには、カレット記号(^
)の後に置換する文字列を入力し、すぐに別のカレット、置換文字列、最後に最後のカレットを入力します。 置換する文字列の一部、または置換として使用する文字列の一部でない限り、スペースを含めないでください。
- ^original^replacement^
これにより、前のコマンド(!!
と同様)が呼び出され、コマンド文字列内でoriginal
のインスタンスが検索され、replacement
に置き換えられます。 次に、置換文字列を使用してコマンドを実行します。
これは、スペルミスなどの処理に役立ちます。 たとえば、/etc/hosts
ファイルの内容を読み取ろうとしたときに、誤って次のコマンドを実行したとします。
- cat /etc/hosst
Outputcat: /etc/hosst: No such file or directory
コマンド全体を書き直すのではなく、代わりに次のコマンドを実行できます。
- ^hosst^hosts^
これにより、前のコマンドのエラーが修正され、正常に実行されます。
単語指定子
イベント指定子の後に、コロン(:
)の後に単語指定子を追加して、一致するコマンドの一部を選択できます。
これは、コマンドを「単語」に分割することによって行われます。単語は、空白で区切られたチャンクとして定義されます。 これにより、コマンドパラメータを操作するための興味深い機会が得られます。
単語の番号付けは、最初のコマンドが「0」、最初の引数が「1」で始まり、そこから続きます。
たとえば、ディレクトリの内容を一覧表示してから、同じディレクトリに移動することを決定できます。 これを行うには、次の操作を連続して実行します。
- ls /usr/share/common-licenses
- cd !!:1
このように最後のコマンドを操作している場合は、2番目の!
とコロンを削除することで、これを短縮できます。
- cd !1
これは同じように動作します。
目的に合っている場合は、最初の引数をカレット(^
)で参照し、最後の引数をドル記号($
)で参照できます。 これらは、特定の数値の代わりに範囲を使用する場合に役立ちます。 たとえば、前のコマンドのすべての引数を新しいコマンドに取り込むには、次の3つの方法があります。
- !!:1*
- !!:1-$
- !!:*
唯一の*
は、最初のコマンド以外の、呼び出されるコマンドのすべての部分に拡張されます。 同様に、数字の後に*
を付けると、指定した単語の後のすべてを含める必要があることを意味します。
修飾子
リコールする履歴行の動作を拡張するために実行できるもう1つのことは、リコールの動作を変更してテキスト自体を操作することです。 これを行うには、展開の最後のコロン(:
)文字の後に修飾子を追加できます。
たとえば、h
修飾子(「ヘッド」の略)を使用して、ファイルに至るまでのパスを切り取ることができます。これにより、最後のスラッシュ(/
)までのパスが削除されます。キャラクター。 これを使用してディレクトリパスを切り捨てており、パスの末尾にスラッシュが付いている場合、これは希望どおりに機能しないことに注意してください。
これの一般的な使用例は、ファイルを変更していて、関連ファイルを操作するためにファイルのディレクトリに移動したい場合です。
たとえば、次のコマンドを実行して、オープンソースソフトウェアライセンスの内容を出力に出力するとします。
- cat /usr/share/common-licenses/Apache-2.0
ライセンスがニーズに合っていることを確認したら、ライセンスが保持されているディレクトリに移動することをお勧めします。 これを行うには、引数チェーンでcd
コマンドを呼び出し、最後にファイル名を切り取ります。
- cd !!:$:h
現在の作業ディレクトリを出力するpwd
を実行すると、前のコマンドに含まれているディレクトリに移動したことがわかります。
- pwd
Output/usr/share/common-licenses
そこに着いたら、そのライセンスファイルをもう一度開いて、今度はless
のようなポケットベルで再確認することをお勧めします。
これを行うには、パスを切り取って、「tail」を表すt
修飾子を含むファイル名のみを使用することにより、前の操作の逆を実行できます。 最後のcat
操作を検索し、t
フラグを使用して、ファイル名のみを渡すことができます。
- less !cat:$:t
完全な絶対パス名を同じように簡単に保持でき、このコマンドはこの場合は正しく機能します。 ただし、これが当てはまらない場合もあります。 たとえば、相対パスを使用して現在の作業ディレクトリの下のいくつかのサブディレクトリ内にネストされたファイルを調べてから、「h」修飾子を使用してサブディレクトリに変更することができます。 この場合、ファイルに到達するために相対パス名に依存することはできなくなります。
もう1つの非常に役立つ修飾子は、末尾の拡張を削除するr
修飾子です。 これは、tar
を使用してファイルを抽出し、後で結果のディレクトリに変更する場合に役立ちます。 生成されたディレクトリがファイルと同じ名前であると仮定すると、次のようなことができます。
- tar xzvf long-project-name.tgz
- cd !!:$:r
tarballがtgz
の代わりにtar.gz
拡張機能を使用している場合は、修飾子を2回渡すだけです。
- tar xzvf long-project-name.tgz
- cd !!:$:r:r
同様の修飾子e
は、末尾の拡張子以外のすべてを削除します。
呼び出しているコマンドを実行せず、それを見つけたいだけの場合は、p
修飾子を使用して、コマンドを実行する代わりにbashにコマンドをエコーさせることができます。
これは、正しいピースを選択しているかどうかわからない場合に役立ちます。 これにより、印刷されるだけでなく、変更したい場合はさらに編集できるように履歴に追加されます。
たとえば、ホームディレクトリでfind
コマンドを実行した後、ルート(/
)ディレクトリから実行したいとしました。 次のように正しい置換を行っていることを確認できます(元のコマンドが履歴の番号119に関連付けられていると仮定します)。
- find ~ -name "file1"
- !119:0:p / !119:2*:p
Outputfind / -name "file1"
返されたコマンドが正しければ、CTRL + P
キーの組み合わせで実行できます。
s/original/new/
構文を使用して、コマンドで置換を行うこともできます。
たとえば、次のように入力することでこれを実現できます。
- !119:s/~/\//
これにより、検索パターンの最初のインスタンス(~
)が置き換えられます。
g
フラグをs
と一緒に渡すことで、すべての一致を置き換えることができます。 たとえば、file1
、file2
、およびfile3
という名前のファイルを作成し、dir1
、dir3
、これを行うことができます:
- touch file1 file2 file3
- mkdir !!:*:gs/file/dir/
もちろん、この場合はmkdir dir1 dir2 dir3
を実行する方が直感的かもしれません。 ただし、修飾子やその他のbash履歴拡張ツールを使い慣れると、コマンドラインで機能と生産性を大幅に拡張できます。
結論
このガイドを読むことで、利用可能な履歴操作をどのように活用できるかについての良いアイデアが得られるはずです。 これらのいくつかはおそらく他のものよりも便利ですが、それらを掘り下げるのに役立つ位置にいることに気付いた場合に備えて、bashにはこれらの機能があることを知っておくとよいでしょう。
他に何もないとしても、history
コマンドだけで、逆検索、および基本的な履歴拡張は、ワークフローをスピードアップするのに大いに役立ちます。