便利な shell いろいろ UNIX では標準の shell として /bin/sh や /bin/csh などがあるが、世の中には、もっと便利な shell がある。 その中で有名なものとして、 csh を機能拡張した tcsh GNU の作った /bin/sh である bash bash, ksh, tcshなどの便利な機能をとりまぜた zsh がある。 今回は、これらの shell のコマンドラインエディット などについて簡単に説明する。 これらの shell の現在の version はそれぞれ tcsh 6.03.00 (Cornell) 92/11/20 bash version 1.12 zsh version 2.3.1 である。これらの shell の version を知るには図1の ようにすればよい。 - --------------------図1はじめ----------------------------- version を調べる - ---------------------------------------------------------- tcsh % echo $version bash $ echo $BASH_VERSION zsh % echo $VERSION - --------------------図1おわり----------------------------- これらの shell では、各自の好みのキーバインドが 可能であるが、そのうちの Emacs バインドについて簡 単に説明する。普通こららの shell は default で Emacsキーバインドになっている。 これらのキーバインドを変更するには bind または bindkey コマンドを使う。また、現在どのようにキーバ インドがされているかを調べるのも同じコマンドを使う。 - --------------------図2はじめ----------------------------- キーバインドの変更、確認 - ---------------------------------------------------------- tcsh 設定 % bindkey "キー" ファンクション すべてのキーバインドの表示 % bindkey bash 設定 $ bind 'キー:ファンクション' すべてのキーバインドの表示 $ bind -l zsh 設定 % bindkey 'キー' ファンクション すべてのキーバインドの表示 % bindkey - --------------------図2おわり----------------------------- これらの shell で prompt にヒストリ番号が入るよ うにするためには、次のようにしておけばよい。 - --------------------図3はじめ----------------------------- prompt をセットする - ---------------------------------------------------------- tcsh % set prompt='[%h] %% ' [2] % bash $ PS1='[\!] $ ' [2] $ zsh % PS1='[%h] %# ' [2] % - --------------------図3おわり----------------------------- コマンドラインでのカーソル移動 コマンドラインでは Emacs と同じキーバインドでカー ソル移動が可能である。コントロール文字以外の普通の 文字を入力すると現在のカーソル位置にその文字が入力 される。また、これ以降の文字削除などのコマンドも現 在のカーソル位置で実行される。 - --------------------図4はじめ----------------------------- カーソル移動のキーバインド - ---------------------------------------------------------- カーソルを1文字分戻す tcsh backward-char CTRL+B bash backward-char CTRL+B zsh backward-char CTRL+B カーソルを1文字分進める tcsh forward-char CTRL+F bash forward-char CTRL+F zsh forward-char CTRL+F 行頭にカーソルを移動 tcsh beginning-of-line CTRL+A bash beginning-of-line CTRL+A zsh beginning-of-line CTRL+A 行末にカーソルを移動 tcsh end-of-line CTRL+E bash end-of-line CTRL+E zsh end-of-line CTRL+E 次のワードに移動 tcsh forward-word ESC f または M-f bash forward-word ESC f または M-f zsh forward-word ESC f または M-f 前のワードに移動 tcsh backward-word ESC b または M-b bash backward-word ESC b または M-b zsh backword-word ESC b または M-b - --------------------図4おわり----------------------------- tcsh, bash, zsh どれも Emacs と同じキー入力でカー ソル移動ができる。例えば、次のように、コマンドを入 力したあと、CTRL+A などを入力するとEmacs と同じよ うにカーソルを移動することができる。カーソルを移動 したあと、普通の文字を入力すると、カーソル位置にそ の文字が入力される。 - --------------------図5はじめ----------------------------- カーソル移動の例 - ---------------------------------------------------------- [5] % ls -la bin lib etc ^ CTRL+A を入力 [5] % ls -la bin lib etc ^ ESC f を入力 [5] % ls -la bin lib etc ^ CTRL+B を入力 [5] % ls -la bin lib etc ^ CTRL+F, CTRL+F を入力 [5] % ls -la bin lib etc ^ CTRL+E を入力 [5] % ls -la bin lib etc ^ ESC b を入力 [5] % ls -la bin lib etc ^ ------------------------------------------------------------ ^ がカーソル位置 - --------------------図5おわり----------------------------- コマンドラインでの削除/復帰 tcsh, bash, zsh どれでも、CTRL+H, BS, DEL キーで カーソル前の文字を消すことができる。また、カーソル 位置に文字があればCTRL+D でその文字を消すことがで きる。 - --------------------図6はじめ----------------------------- 一文字削除 - ---------------------------------------------------------- カーソル前の文字を削除 tcsh backward-delete-char CTRL+H または DEL bash backward-delete-char CTRL+H または DEL zsh backward-delete-char CTRL+H または DEL カーソル位置に文字があればそれを削除 なければファイル名補完のリストを表示 tcsh delete-char-or-list CTRL+D zsh delete-char-or-list CTRL+D カーソル位置に文字があればそれを削除 bash delete-char CTRL+D - --------------------図6おわり----------------------------- 図7 のように CTRL+H, BS, DEL を入力するとカーソ ル位置の前の文字を消去できる。また、CTRL+D を入力 するとカーソル位置の文字が消去できる。 - --------------------図7はじめ----------------------------- 文字削除の例 - ---------------------------------------------------------- [5] % ls -la bin lib etc ^ CTRL+H を入力 [5] % ls -la bin libetc ^ BS を入力 [5] % ls -la bin lietc ^ DEL を入力 [5] % ls -la bin letc ^ CTRL+D を入力 [5] % ls -la bin ltc ^ ------------------------------------------------------------ ^ がカーソル位置 - --------------------図7おわり----------------------------- また、図8 に示すように、CTRL のかわりに METAキー を使うと1文字の代わりに1ワードを削除することができ る。META のほかに、ESC を入力してから CTRL+H や D を入力することでも同じようにワード削除が可能であ る。 - --------------------図8はじめ----------------------------- 削除/復帰- ---------------------------------------------------------- 前のワードを消去 tcsh backward-delete-word ESC CTRL+H または M-CTRL+H bash backward-kill-word ESC DEL zsh backward-kill-word CTRL+W または ESC CTRL+H ワードを消去 tcsh delete-word ESC d または M-d bash kill-word ESC d zsh delete-word ESC d 入力行全部を消去 tcsh kill-whole-line CTRL+U bash unix-line-discard CTRL+U zsh kill-whole-line CTRL+U カーソル位置から行末まで消去 tcsh kill-line CTRL+K bash kill-line CTRL+K zsh kill-line CTRL+K マークセット tcsh set-mark-command CTRL+@ zsh set-mark-command CTRL+@ カーソルとマークを入れ換える tcsh exchange-point-and-mark CTRL+X CTRL+X zsh exchange-point-and-mark CTRL+X CTRL+X 領域消去 tcsh kill-region CTRL+W 消去した文字列をカーソル位置に挿入 tcsh yank CTRL+Y bash yank CTRL+Y zsh yank CTRL+Y 領域をコピーするが削除はしない tcsh copy-region-as-kill ESC w または M-w zsh copy-region-as-kill ESC w - --------------------図8おわり----------------------------- - --------------------図9はじめ----------------------------- ワード削除の例 - ---------------------------------------------------------- [6] % ls -la bin lib etc ^ M-CTRL+H (または ESC CTRL+H)を入力 [6] % ls -la bin etc ^ M-DEL (または ESC DEL)を入力 [6] % ls -la etc ^ M-D (または ESC D)を入力 [6] % ls -la ^ ------------------------------------------------------------ ^ がカーソル位置 - --------------------図9おわり----------------------------- 図10 のように Emacs と同じく CTRL+K でカーソル位 置から行末までが削除できるし、tcsh の場合はCTRL+@ でマークをセットしておいて CTRL+W で領域削除も可 能である。bash では マークセットのコマンドを実行す るキーバインドがないのでこれはできない。zsh では default では kill-region がバインドされてい ないが、これを適当なキーにバインドすれば tcsh と同 じように実行できる。 - --------------------図10はじめ----------------------------- 削除の例 - ---------------------------------------------------------- [7] % ls -la bin lib etc ^ CTRL+K を入力 [7] % ls -la bin lib ^ M-b, M-b でカーソル移動 [7] % ls -la bin lib ^ CTRL+@ でマークセット [7] % ls -la bin lib ^ M-f でカーソル移動 [7] % ls -la bin lib @ ^ CTRL+W で領域削除 [7] % ls -la lib ^ ------------------------------------------------------------ ^ がカーソル位置 - --------------------図10おわり----------------------------- tcsh や zsh では、図10の最後の状態で CTRL+Y を入 力すれば Emacs と同じようにさっき CTRL+W で削除し た文字列がカーソル位置に挿入される。 - --------------------図11はじめ----------------------------- yank の例 - ---------------------------------------------------------- [7] % ls -la lib ^ M-f でカーソル移動 [7] % ls -la lib ^ CTRL+Y で yank [7] % ls -la libbin さっき削除した binが挿入 ^ される ------------------------------------------------------------- ^ がカーソル位置 - --------------------図11おわり----------------------------- sh や csh のように、 CTRL+U を入力すると現在の入 力行を全部削除して入力しなおすことができる。 - --------------------図12はじめ----------------------------- CTRL+Uの例 - ---------------------------------------------------------- [7] % ls -la libbin ^ CTRL+U を入力 [7] % ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図12おわり----------------------------- tcsh や zsh では Emacs と同じようにマークとリー ジョンという概念がある。マークについては CTRL+X CTRL+X で Emacs と同じようにマークとカーソル位置を 入れ換えることができるし、CTRL+W のかわりに M-W (または ESC W) を入力すれば実際に領域を消さずに削 除バッファにコピーすることができる。 ヒストリ機能 tcsh では csh のヒストリ機能に加えてコマンド行で 実際にヒストリをたどることができるようになっている。 bash や zsh でも、csh の '!' などを使ったヒストリ 機能が使えるほか、tcsh と同じくコマンド行で実際に ヒストリをたどることができる。 csh では '!' などを使ってヒストリの中のコマンド を指定するが tcsh や bash, zsh では CTRL+P や CTRL+N などをつかってヒストリの中を現在のコマンド 行に出してくることができる。 - --------------------図13はじめ----------------------------- ヒストリ機能 - ---------------------------------------------------------- 前のヒストリを現在の入力行にする tcsh up-history CTRL+P bash previous-history CTRL+P 複数行のときは上の行にカーソルを移動する。 そうでないときは、前のヒストリを現在の入力行にする。 zsh up-line-or-history CTRL+P 次のヒストリを現在の入力行にする tcsh down-history CTRL+N bash next-history CTRL+N 複数行のときは下の行にカーソルを移動する。 そうでないときは、次のヒストリを現在の入力行にする。 zsh down-line-or-history CTRL+N ヒストリの中を後にサーチする tcsh history-search-backward ESC p または M-p zsh history-search-backward ESC p ヒストリの中を後にインクリメンタルサーチをする bash reverse-search-history CTRL+R zsh history-incremental-search-backward CTRL+R または CTRL+X r ヒストリの中を前にサーチする tcsh history-search-forward ESC n または M-n zsh history-search-backward ESC p ヒストリの中を前にインクリメンタルサーチをする bash forward-search-history CTRL+S zsh history-incremental-search-forward CTRL+S または CTRL+X s csh のヒストリを実際に展開する。 tcsh expand-history ESC ! または ESC SPACE など bash shell-expand-line ESC CTRL+E zsh expand-history ESC ! または ESC SPACE ヒストリの先頭を現在の入力行にする bash beginning-of-history ESC < 複数行のときは先頭にカーソルを移動する。 そうでないときは、ヒストリの先頭を現在の入力行にする。 zsh beginning-of-buffer-or-history ESC < ヒストリの最後を現在の入力行にする bash end-of-history ESC > 複数行のときは最後にカーソルを移動する。 そうでないときは、ヒストリの最後を現在の入力行にする。 zsh end-of-buffer-or-history ESC > 現在のコマンドを実行して、そのコマンドが終了したら、 ヒストリの次のコマンドをコマンドラインに出す。 ヒストリの次のコマンドがないときは、現在のコマンドも実行されない。 zsh accept-line-and-down-history CTRL+O ヒストリに登録するのを、入力行そのままかシェルによっ て処理された後の行にするかをきりかえる。 tcsh toggle-literal-history ESC r または M-r zsh toggle-literal-history ESC r または M-r - --------------------図13おわり----------------------------- tcsh, bash, zsh では、 図14のように CTRL+P, CTRL+N を使えばコマンド行でヒストリをたどることが できる。実行したいコマンドが見つかればそこで RETURN を入力すれば、コマンド行で表示されているコ マンドが実行される。 - --------------------図14はじめ----------------------------- ヒストリの例 (tcsh の場合, bashやzshでもほぼ同じ) - ---------------------------------------------------------- [7] % history ( history の実行 ) 1 0:02 set history=20 2 0:02 set prompt='[%h] %% ' 3 0:03 ls 4 0:05 ls -l 5 0:07 ls -la bin ltc 6 0:10 ls -la [8] % ^ CTRL+P を入力 [8] % history ヒストリ 7 のコマンド ^ CTRL+P を入力 [8] % ls -la bin ltc ヒストリ 6 のコマンド ^ CTRL+N を入力 [8] % history ヒストリ 7 のコマンド ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図14おわり----------------------------- CTRL+P, CTRL+N でヒストリをたどって表示したコマ ンド行もカーソル移動コマンドでカーソルを移動して 文字の挿入や削除もすることができる。コマンド行の編 集が済めば、RETURN キーを入力して実行すればよい。 コマンド行で編集してもヒストリの中の行は変更を受け ることはない。 - --------------------図15はじめ----------------------------- ヒストリの例2 - ---------------------------------------------------------- [8] % history ヒストリ 7 のコマンド ^ CTRL+P CTRL+P を入力 [8] % ls -la bin ltc ヒストリ 5 のコマンド ^ CTRL+B CTRL+B 'ib e' を挿入 [8] % ls -la bin lib etc ^ RETURN ( ls -la bin lib etc が実行される) [9] % ^ CTRL+P [9] % ls -la bin lib etc ヒストリ 8 のコマンド ^ CTRL+P, CTRL+P, CTRL+P [9] % ls -la bin ltc ヒストリ 5 のコマンド ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図15おわり----------------------------- tcsh では、ESC P, ESC N などを使ってヒストリの中 でサーチができる。。コマンド行で文字列を入力して ESC P を入力するとそのコマンド行の文字列ではじまる ようなコマンド行をヒストリの中を後から順にサーチす る。ESC N は ESC P とは逆向きのサーチをおこなう。 bash や zsh では CTRL+R, CTRL+S を使ってヒストリの 中をインクリメンタルサーチができる。 - --------------------図16はじめ----------------------------- ヒストリサーチの例 (tcsh の場合) - ---------------------------------------------------------- [9] % ls -la bin ltc ヒストリ 5 のコマンド ^ CTRL+N, CTRL+N [9] % history ヒストリ 7 のコマンド ^ RETURN ( history の実行 ) 1 0:02 set history=20 2 0:02 set prompt='[%h] %% ' 3 0:03 ls 4 0:05 ls -l 5 0:07 ls -la bin ltc 6 0:10 ls -la 7 0:14 history 8 0:20 ls -la bin lib etc [10] % ^ 'ls' を入力 [10] % ls ^ ESC P を入力 lsではじまる行をサーチ [10] % ls -la bin lib etc ^ ESC P を入力 lsではじまる行をサーチ [10] % ls -la ^ ESC P を入力 lsではじまる行をサーチ [10] % ls -la bin ltc ^ ESC N を入力 lsではじまる行をサーチ [10] % ls -la ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図16おわり----------------------------- - --------------------図17はじめ----------------------------- ヒストリサーチの例 (bash の場合) - ---------------------------------------------------------- [10] % ^ CTRL+R を入力 (reverse-i-search)`': ^ ls と入力 Emacs のようにインクリメンタルサーチ をおこなう。 (reverse-i-search)`ls': ls -la bin lib etc ^ CTRL+R を入力 lsではじまる行をさらにサーチ (reverse-i-search)`ls': ls -la ^ CTRL+R を入力 lsではじまる行をさらにサーチ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図17おわり----------------------------- - --------------------図18はじめ----------------------------- ヒストリサーチの例 (zsh の場合) - ---------------------------------------------------------- [10] % ^ CTRL+R を入力 [10] % ^ i-search: ls と入力 Emacs のようにインクリメンタルサーチ をおこなう。 [10] % ls -la bin lib etc ^ i-search: ls CTRL+R を入力 lsではじまる行をさらにサーチ [10] % ls -la ^ i-search: ls CTRL+R を入力 lsではじまる行をさらにサーチ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図18おわり----------------------------- tcsh では csh のヒストリ機能をそのまま使える。ま た、bash や zsh でも csh の '!' や '^' を使ったヒ ストリ機能を使うことができる。 さらに、tcsh と zsh には expand-history、 bash では shell-expand-line という便利な機能も用意されて いる。これを使えば、図19のようにヒストリをコマンド 行に出してくることができる。 もちろん、展開されたヒストリはその場で編集するこ とも可能である。 - --------------------図19はじめ----------------------------- ヒストリ展開の例 - ---------------------------------------------------------- [11] % ^ '!!' を入力 [11] % !! ^ M-! を入力 (bash は ESC CTRL+E) [11] % ls -la ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図19おわり----------------------------- - --------------------図20はじめ----------------------------- ヒストリ展開の例 2 - ---------------------------------------------------------- [12] % !his ^ M-! を入力 (bash は ESC CTRL+E) [12] % history ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図20おわり----------------------------- zsh では、複数行にわたるコマンドもひとつのコマン ドとして認識するので、ヒストリを使う時も複数行のコ マンドは図21のようにひとつとみなされるので非常に便 利である。このように複数行は Emacs の buffer の中 と同じようにカーソル移動もできる。 - --------------------図21はじめ----------------------------- zsh のヒストリ - ---------------------------------------------------------- [12] % for i in * > do > nkf -e $i > $i.euc > done [13] % ^ CTRL+P を入力 [13] % for i in * do nkf -e $i > $i.euc done ^ CTRL+P を入力 [13] % for i in * do nkf -e $i > $i.euc CTRL+P を入力 ^done [13] % for i in * do CTRL+P を入力 ^nkf -e $i > $i.euc done [13] % for i in * CTRL+P を入力 do ^ nkf -e $i > $i.euc done [13] % history ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図21おわり----------------------------- 名前補完機能 csh では set filec をすることによってファイル名 補完をすることが可能である。 tcsh や bash、zsh ではさらに便利な補完機能が利用 できる。 csh では ESC でファイル名補完をおこなうが、tcsh, bash, zsh では CTRL+I (TAB) でファイル名補完をおこ なうことができる。 - --------------------図22はじめ----------------------------- 補完機能 - ---------------------------------------------------------- 補完する tcsh complete-word CTRL+I または ESC ESC など bash complete CTRL+I 補完するか、globbing(ワイルドカード)などを展開する。 zsh expand-or-complete CTRL+I カーソル位置に文字があればそれを削除 なければ補完のリストを表示 tcsh delete-char-or-list CTRL+D zsh delete-char-or-list CTRL+D globbingを展開する tcsh expand-glob CTRL+X * 変数を展開する tcsh expand-variables CTRL+X $ ワードを展開する(globbingや変数など) zsh expand-word CTRL+X * globbing を展開したリストを表示する tcsh list-glob CTRL+X g zsh list-expand CTRL+X g コマンド名を補完する bash complete-command ESC ! ファイル名を補完する bash complete-filename ESC / ホスト名を補完する bash complete-hostname ESC @ ユーザ名を補完する bash complete-username ESC ~ 変数を補完する bash complete-variable ESC $ ファイル名を正規化する(symbolic link などを含んでいる場合など) tcsh normalize-path CTRL+X n 補完リストの表示 tcsh list-choices ESC CTRL+D または M-CTRL+D bash possible-completions ESC ? zsh list-choices ESC CTRL+D 補完リストの表示(コマンド) bash possible-command-completions CTRL+X ! 補完リストの表示(ファイル名) bash possible-command-completions CTRL+X / 補完リストの表示(ホスト名) bash possible-command-completions CTRL+X @ 補完リストの表示(ユーザ名) bash possible-command-completions CTRL+X ~ 補完リストの表示(変数名) bash possible-command-completions CTRL+X $ - --------------------図22おわり----------------------------- - --------------------図23はじめ----------------------------- ファイル名補完の例 - ---------------------------------------------------------- [14] % ls Mail News bin lib work [15] % ls b ^ TAB を入力 [15] % ls bin ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図23おわり----------------------------- tcsh, bash, zsh ではコマンド行の先頭では path 上 にあるコマンドが補完されるし、そのほかシェル変数や csh の ~ の後のユーザ名置換に対しても補完してくれ る。入力した文字に一致する名前が見つからなかったと きはビープを鳴らす。また、入力した文字ではじまる名 前を持つものが複数存在するときは共通する部分までが 補完され後ビープを鳴らす。 ~ がホームディレクトリを表わすことを知っているの で補完の時にも期待通りの動作をしてくれる。また、シェ ル変数も期待通りに補完してくれる。 - --------------------図24はじめ----------------------------- 名前補完の例 (tcsh, zsh) - ---------------------------------------------------------- [16] % set sys=/usr1/386BSD/v0.1/sys ( zsh では [16] % sys=/usr1/386BSD/v0.1/sys とする ) [17] % ls $sy ^ TAB を入力 [17] % ls $sys/ ^ p を入力 [17] % ls $sys/p ^ TAB を入力 [17] % ls $sys/pc beep が鳴る ^ 9 を入力 [17] % ls $sys/pc9 ^ TAB を入力 [17] % ls $sys/pc98/ ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図24おわり----------------------------- このようにtcsh, zsh では、ファイル名の一部にシェ ル変数が含まれていても正しく補完される。 tcsh, zsh では、csh で set filec した時と同じよ うにコマンド行の最後で CTRL+D を入力すると補完のリ ストを表示してくれる。 - --------------------図25はじめ----------------------------- 補完リスト表示の例 (tcsh, zsh) - ---------------------------------------------------------- [17] % ls $sys/pc98/ ^ CTRL+D を入力 Makefile conf/ i386/ include/ pc98/ stand/ [17] % ls $sys/pc98/ ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図25おわり----------------------------- さらに tcsh, zsh では * などを含んだファイル名を展開 したり、シェル変数を展開してくれる。 - --------------------図26はじめ----------------------------- globbing やシェル変数の展開の例 (tcsh) - ---------------------------------------------------------- [17] % ls $sys/pc98/ ^ CTRL+X $ を入力 [17] % ls /usr1/386BSD/v0.1/sys/pc98/ ^ *98を入力 [17] % ls /usr1/386BSD/v0.1/sys/pc98/*98 ^ CTRL+X g を入力 /usr1/386BSD/v0.1/sys/pc98/pc98 [17] % ls /usr1/386BSD/v0.1/sys/pc98/*98 ^ CTRL+X * を入力 [17] % ls /usr1/386BSD/v0.1/sys/pc98/pc98 ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図26おわり----------------------------- - --------------------図27はじめ----------------------------- globbing やシェル変数の展開の例 (zsh) - ---------------------------------------------------------- [17] % ls $sys/pc98/ ^ CTRL+X * を入力 [17] % ls /usr1/386BSD/v0.1/sys/pc98/ ^ スペースがはいるので1文字もどって *98 を入力 [17] % ls /usr1/386BSD/v0.1/sys/pc98/*98 ^ CTRL+X g を入力 /usr1/386BSD/v0.1/sys/pc98/pc98 [17] % ls /usr1/386BSD/v0.1/sys/pc98/*98 ^ CTRL+I を入力 [17] % ls /usr1/386BSD/v0.1/sys/pc98/pc98 ^ ------------------------------------------------------------- ^ がカーソル位置 - --------------------図27おわり----------------------------- 次回は、今回説明できなかったファイル名訂正機能や、help 機能などについ て説明しようと思う。