Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bashのhistoryコマンド活用術!履歴検索・再実行・文字列置換をマスターする

Bashには豊かな「履歴」があります。つまり、Bashは古いシェルであり、さらにその祖先にあたるBourneシェルはもっと古いのですが、同時にBashのhistoryコマンドは、その多機能さにおいて他のどのシェルの履歴インターフェースよりも優れています。Bash版のhistoryでは、逆順検索、素早い再実行、履歴の書き換えなど、さまざまな操作が可能です。

historyコマンドはシェル組み込み関数

historyコマンドは、他の多くのコマンドとは性質が異なります。通常のコマンドは/usr/bin/usr/local/bin~/binといったシステム共通の場所に配置された実行ファイルですが、組み込みのhistoryコマンドはPATH上に存在せず、物理的な実体を持ちません。

$ which history
which: no history in [PATH]

代わりに、historyはシェル自体に組み込まれた機能です。実際に確認してみると、次のように表示されます。

$ type history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or 
history -anrw [filename] or 
history -ps arg [arg...]

Display or manipulate the history list.
[...]

このため、各シェルのhistory機能はそれぞれ独自のものであり、Bashで使える操作がTcshやFish、Dashでは使えないことがあります。逆に言えば、Bashの履歴機能を知ることが、他のシェルユーザーが同じ挙動を再現するためのヒントになったり、自分でも知らなかったBashの便利な機能に気づくきっかけになったりするのです。

Bashの履歴を表示する

historyコマンドの最も基本的で頻繁な使い方は、シェルセッションのコマンド履歴を一覧表示することです。

$ echo "hello"
hello
$ echo "world"
world
$ history
   1  echo "hello"
   2  echo "world"
   3  history

イベント指定子(Event Designators)とは

イベント指定子は、履歴を「イベント」単位で検索する仕組みです。ここでのイベントとは、履歴に記録された1つのコマンドのことで、改行文字で区切られた1行を指します。言い換えれば、参照用のインデックス番号が振られた1行分の履歴のことです。

イベント指定子は主に感嘆符、通称「バン(bang)」(!)で始まります。

番号を指定してコマンドを再実行する

履歴から特定のコマンドを再実行したい場合は、感嘆符に続けて(スペースを入れずに)目的のコマンドのインデックス番号を入力します。たとえば、1行目にecho "hello"というコマンドがあり、それをもう一度実行したい場合は次のようにします。

$ !1
echo "hello"
hello

相対位置で指定する

現在位置から数えて何行前かを負の数で指定すれば、相対的な位置でコマンドを呼び出すこともできます。たとえば、3つ前の履歴に戻りたい場合は以下のとおりです。

$ echo "foo"
foo
$ echo "bar"
bar
$ echo "baz"
baz
$ !-3
echo "foo"
foo

また、1行前だけ戻るのであれば、!-1の代わりに短縮形の!!が使えます。キーストロークが1回節約できるのです。

$ echo "foo"
$ !!
echo "foo"
foo

文字列で履歴を検索する

番号だけでなく、特定の文字列を使って履歴を遡って検索し、コマンドを実行することもできます。特定の文字列で始まるコマンドを検索するには、感嘆符の直後に(スペースを空けずに)検索したい文字列を続けます。

$ echo "foo"
$ true
$ false
$ !echo
echo "foo"
foo

さらに、先頭以外の任意の位置にその文字列を含むコマンドを検索することも可能です。その場合は、通常どおり!に検索文字列を続けますが、文字列の前後を疑問符(?)で囲みます。なお、検索文字列の直後に改行文字が続くことが分かっている場合(つまりReturnキーを押す前に打った最後の文字である場合)は、末尾の疑問符を省略できます。

$ echo "foo"
$ true
$ false
$ !?foo?
echo "foo"
foo

文字列を置換してコマンドを修正する

行頭の文字列を検索するのと似た使い方として、履歴内の文字列を検索して別の文字列に置き換えることもできます。これにより、過去のコマンドを手早く修正して実行できます。

$ echo "hello"
hello
$ echo "world"
world
$ ^hello^foo
echo "foo"
foo

履歴を「使う」ことで作業効率を上げよう

Bashのhistoryコマンドは、ここで紹介した内容以外にも多くの機能を備えています。しかし、まずは履歴を単なる参照データとして扱うのではなく、積極的に活用する習慣をつけることが良い第一歩となります。historyコマンドやイベント指定子を日常的に使ってみてください。コマンドを一から入力せずにどこまで作業できるか、自分でも驚くかもしれません。

  1. 【Windows 10】ファイル履歴のバックアップ先を別のドライブに変更する方法

    このチュートリアルでは、Windows 10の「ファイル履歴」機能において、バックアップの保存先として別のドライブを使用する方法を、手順を追って詳しく解説します。 以前の記事では、ドキュメント、ピクチャ、ミュージック、ビデオ、デスクトップなどの個人ファイルを自動的にバックアップする方法をご紹介しました。すでに「ファイル履歴」を使ってバックアップを行っており、保存先を別のドライブに変更したい場合は、ぜひ本記事を参考にしてください。 ファイル履歴のドライブを変更する手順 バックアップ先のドライブを変更するには、以下の手順に従ってください。 1. コントロールパネルから「ファイル履歴」を開く コント

  2. Windows 10の「ファイル履歴」を使って安全なバックアップを作成する方法

    Windows 10には「ファイル履歴(File History)」という便利な機能があり、誤ってファイルを削除してしまった場合などに備えて、ファイルやフォルダーのコピーを安全な場所へバックアップできます。デフォルトでは、ミュージック、ピクチャ、ドキュメント、ダウンロード、ビデオの各フォルダー内のファイルがバックアップ対象になりますが、既定のフォルダーを解除したり、独自のフォルダーを自由に追加したりすることも可能です。 最も安全な運用を実現するために、マイクロソフトはUSBメモリなどの外付けドライブ、またはネットワークドライブを使ったバックアップを推奨しています。他にもバックアップの保存先はあ