はじめに

fcというhistoryを扱うコマンドがある。危険で怖いコマンドのため安易に使わないほうがいい。

fcはコマンドヒストリを処理するためのコマンドだが、コマンドライン上でエディタが立ち上がりコマンドの編集ができるため、Vimの力を借りてコマンドを効率よく書くことができる。はじめ、この記事のタイトルを「Bashのキーバインドを使うより、fcコマンドでVimの力を借りてコマンド入力効率を上げる」にしようと考えていた。しかしfcの挙動が自分の直感と異なっていることから、サーバを壊しかねないと考え、便利だと勧める人やウェブサイトがあったとしても「安易に使うな」と主張したい。

fcコマンドの良さ

まずはfcコマンドがなぜ便利なのかというところを記載する。

bashはEmacsキーバインド

Bashのコマンドライン上でコマンドを入力するときはEmascのキーバインドを使うことになる。コマンドラインの文頭/文末に移動したりするだけなら十分便利に使用できる。
よく使われる便利なコマンドは以下の通り。(関連:bashのショートカットキー
※WindowsでRLoginをターミナルソフトとして利用している場合、サーバ情報のキーボード設定でAltをMetaキーとして利用する設定が必要。

コマンド 動作
Ctrl + a 文頭にカーソル移動
Ctrl + e 文末にカーソル移動
Alt(Metaキー) + f 単語単位で右へカーソル移動
Alt(Metaキー) + b 単語単位で左へカーソル移動
Ctrl + h Backspaceと同じ
Ctrl + j Enterと同じ
Ctrl + m Enterと同じ
Ctrl + f 右へカーソル移動
Ctrl + b 右へカーソル移動

はじめの4つのコマンドは一気にカーソルを移動できるので特に便利だ。

Vimキーバインドが使いたい

EmacsのキーバインドでもVimでできることは大抵できるが、長いコマンドを編集するときにはやはり慣れたVimキーバインドを使いたい。
そこでfcコマンドを使うとVimで編集できるようになる。
コマンドライン上でfcと打つと、Viが立ち上がる。ファイル名"/tmp/bash-fc-14311700744"のように一時ファイルが作られ、ここにコマンドを書いていく。直前のコマンドが元から入力済みとなっている。コマンドを編集し、Viを抜けるとコマンドが実行される。
より高度な編集をするためViではなくてVimが立ち上がってほしければfc -e vim-eオプションで指定するか、FCEDIT=vimとFCEDIT変数(FCEDIT変数が未設定の場合は、EDITOR変数)で指定してからfcコマンドをうつ。

# オプションでVim指定
$ fc -e vim

# 変数でVim指定
$ FCEDIT=vim
$ fc

特にパイプで大量にコマンドをつなぐときやヒアドキュメントを使うときにコマンドライン上で書くよりもすごく書きやすくなる。

fcコマンドの罠

Viを抜けると即座に記載されたコマンドが実行されるのだが、注意すべきは、:q!で保存せずに抜けても元から入力済みとなっているコマンドが実行されてしまうため、何も実行したくなければファイルを空っぽにしてから:wqで保存して抜けなければならないということだ。
fcと打ってViが一時ファイルを開いたときには、すでに一時ファイルに前回打ったコマンドが記載されているので、:q, :q!でViを抜けても前回打ったコマンドが記載されたままとなっている。

:q:q!を入力しているのに直前のコマンドが実行されてしまうのは、理屈として正しくても、あまり自分の感覚と合わない。特に:q!の方は編集内容を破棄しているわけで、脳は編集だけでなくコマンドの実行もキャンセルしたつもりになってしまいがちだ。

もし元々入力されていたコマンドが、rm -rf *のようなコマンドだとしたら。。。
あるいは外部システムのデータ更新APIを実行するようなものだとしたら。。。
事故防止のため、便利とはいえ、自分の感覚と合わないfcコマンドは使わないようにしようと思う。

次回は、同じようなことがMySQLクライアントのコマンドでも言えるため、そのコマンドについて記述したい。
安易に使わないほうがいいMySQLClientコマンド"edit"