ヒストリー機能で512倍楽をする方法

シェルの楽々操作法

入力は1度だけ!ヒストリー機能

macOSではzsh、Linuxではbashがデフォルトのシェルです。シェルとは、ユーザーとコンピューターの間のインターフェースで、ユーザーが入力したコマンドをコンピューターに伝えて実行させるプログラムです。シェルは過去に実行したコマンドを履歴として記録しています。次のコマンドで履歴を確認できます。

history

historyコマンドを多用する場合は、シェルのプロファイルなどで下のように alias を定義することが多いでしょう。

alias h='history'

zshやbashでは、矢印キーを使ってコマンド編集することができます。これは、入力したコマンドを修正したり、履歴から再利用したりするときに便利です。具体的な操作方法は以下の通りです。

  • 左右の矢印キー:カーソルを一文字ずつ左右に移動させます。例えば、echo helloと入力した後に左矢印キーを押すと、カーソルがoの上に移動します。
  • 上下の矢印キー:コマンド履歴を遡ったり進んだりします。例えば、echo helloと入力した後に上矢印キーを押すと、直前に実行したコマンドが表示されます。下矢印キーを押すと、次に実行したコマンドが表示されます。
  • Ctrl + 左右の矢印キー:カーソルを一単語ずつ左右に移動させます。例えば、echo hello worldと入力した後にCtrl + 左矢印キーを押すと、カーソルがworldの先頭に移動します。
    なお、Macのキーボードの場合は、Ctrlキーの代わりにCtrlキーを使用します。
  • Ctrl + A:カーソルを行頭に移動させます。例えば、echo hello worldと入力した後にCtrl + Aを押すと、カーソルがeの上に移動します。
  • Ctrl + E:カーソルを行末に移動させます。例えば、echo hello worldと入力されている行の先頭にカーソルがある場合、Ctrl + Eを押すと、カーソルがdの後ろに移動します。
  • Ctrl + U:bashではカーソルより前の部分を削除します。zshではカーソルの位置に関係なく、1行を削除します。例えば、echo hello worldと入力した後にCtrl + Uを押すと、echo hello worldが消えて空白になります。
  • Ctrl + K:カーソルより後ろの部分を削除します。例えば、echo hello worldと入力した後に左矢印キーを5回押してからCtrl + Kを押すと、worldが消えてecho hello になります。
  • Ctrl + Y:削除した部分を貼り付けます。例えば、上記の操作で削除したworldを再び表示させたい場合は、カーソルの位置に関係なくCtrl + Yを押すと、worldが貼り付けられます。

上記を活用した具体例を見てみましょう。

nanoコマンドでファイルを編集したとします。bashの例です。

nano ~/works/docs/extremely-long-filename.txt

次に、上記で編集したファイルの行数を調べたいときには、次のように入力します。

[↑][Ctrl+A][Ctrl+右矢印][Ctrl+U][wc -l][return]

実行結果は下の通りです。$はプロンプトです。

$ nano ~/works/docs/extremely-long-filename.txt
$ wc -l ~/works/docs/extremely-long-filename.txt
27 /home/linux/works/docs/extremely-long-filename.txt

1ステップごと説明します。

[↑]:直前に実行したコマンドを表示

$ nano ~/works/docs/extremely-long-filename.txt
[Ctrl+A]:カーソルが行の先頭に移動(nの位置)
[Ctrl+右矢印]:nanoの次の空白に移動
[Ctrl+U]:nanoを削除

$  ~/works/docs/extremely-long-filename.txt
[wc -l]:行数を数えるコマンドを先頭から入力

$ wc -l ~/works/docs/extremely-long-filename.txt
[Enter]:カーソル位置は、l(エル)の次の空白ですが、そのままEnter(return)で構いません。カーソルの位置に関係なく、1行全体が実行されます。

もっと便利なインクリメンタルサーチ

インクリメンタルサーチは、シェルが記録している履歴から特定のコマンドを検索するための機能です。
例えば、あなたが過去に次のコマンドを実行したことがあるとします。下はmacOSのzshの例です。

% cut -d: -f1 /etc/passwd | grep -v -e '^_' -e '^#'
nobody
root
daemon
%

その後、新しいコマンドをたくさん実行した後で、再び同じコマンドラインを実行したいと思った場合、インクリメンタルサーチを使うことで、過去に実行したコマンドラインを素早く再利用することができます。
シェルのインクリメンタルサーチは、Ctrl + r キーを押すことで起動します。すると、プロンプトが表示されます。

%
bck-i-search: _

このプロンプトに検索したい文字列を入力すると、過去に実行したコマンド履歴から入力された文字列に一致するものが即座に表示されます。下は c とだけ入力した場合に、cd コマンドがヒットした例です。

% cd /tmp
bck-i-search: c_

続いて u と入力すると、下のように表示されました。

% cut -d: -f1 /etc/passwd | grep -v -e '^_' -e '^#'
bck-i-search: cu_

一致するコマンドが複数ある場合は、Ctrl + r キーを押すたびに一つずつ表示されます。
この状態で Enter キーを押すと、そのコマンドが実行されます。

コマンド入力の自動補完

コマンド入力の自動補完とは、コマンドやファイル名などの一部を入力した後にTabキーを押すと、シェルが可能性のある候補を表示したり、最も適切なものに補完したりする機能です。これは、コマンド入力を効率的にし、タイプミスを防ぐのに役立ちます。

自動補完は、bashとzshでは動作が異なりますが、ここではbashの例で説明します。
例えば、以下のような操作ができます。

whereisというコマンドを入力したい場合は、wheとだけ入力してからTabキーを押すと、whereisに補完されます。もし、wheで始まる他のコマンドがある場合は、Tabキーを二回押すと、候補の一覧が表示されます。その中から選択したいものの先頭文字を追加入力してから再びTabキーを押すと、補完されます。

$ w  ← wとだけ入力してTabキーを2回押した
w          wall       wfsctl     whereis    who        wish       wsgen
wait       wc         what       which      whoami     wish8.5    wsimport
wait4path  wdutil     whatis     while      whois      write      
$ wh  ← hを追加してTab2回。候補が減った
what     whatis   whereis  which    while    who      whoami   whois
$ whereis  ← eを追加してTabで完全に補完された

Documentsというディレクトリに移動したい場合は、cd Dと入力してからTabキーを押すと、Dで始まるディレクトリ名が補完されます。もし、複数の候補がある場合は、Tabキーを二回押すと、候補の一覧が表示されます。その中から選択したいものの先頭文字を追加入力してから再びTabキーを押すと、補完されます。このように、引数に指定されたディレクトリ名やファイル名も補完されます。
hello.txtというファイル名を入力したい場合は、hとだけ入力してからTabキーを押すと、hで始まるファイル名が補完されます。

$ touch hello.txt
$ nano h ← Tabを押す
$ nano hello.txt  ← 補完された

最後に

ここまで、macOSのUnixやLinuxのzshやbashで矢印キーを使ってコマンド編集する操作と、UnixのシェルでTabを使ってコマンド入力の自動補完を行う方法を紹介しました。これらの操作は慣れるまで少し難しく感じるかもしれませんが、覚えておくとコマンド入力が効率的になります。ぜひ、実際に試してみてください。