昨日のエントリでも,いくつか便利なコマンド実行方法がひそんでいたのですが,一つ一つ解説すると長くなりますので,別にしました.
ファイル名の補完
リンクエラーに対処するでは,ファイル内の単語(識別子)の補完を取り上げましたが,別のキーストロークで,ファイル名を補完することができます.
先頭の何文字かを入力してから,Tabキーを押せばいいのです.
以下に,シェル(bash)での利用例を示します.
$ env LC_ALL=C gcc rela ↓ (ここでTabキーを押す) ↓ $ env LC_ALL=C gcc relatively_prime.c
Tabキーを押してもうまく補完してくれないときは,「先頭の何文字か」に該当するファイルが複数あるか,一つもないかのどちらかです*1.
では,
$ env LC_ALL=C gcc relatively_prime.c -o relatively_prime
を効率よく入力するには,どうすればいいでしょうか? 実行ファイルrelatively_primeは,まだ作られていないとします.
最後の引数について,「relatively_prime」というファイルはなくても,ソースファイル「relatively_prime.c」はあるわけですから,ここでも「rela」あたりまで打ち込んでからTabキーで「relatively_prime.c」までを出し,それから,BackSpaceで2文字を消す,というのが答えとなります.
直前のコマンドの最後の引数
コンパイルと実行のコマンドを再掲します.
$ env LC_ALL=C gcc relatively_prime.c -o relatively_prime $ ./relatively_prime
実行の際ですが,「./r」,そしてTabでも,おそらくは「./relatively_prime」が出るとは思いますが,ここはもう少しストロークを減らせます.
具体的には「./」のあと,Altを押しながら.のキーです.
Emacs流に書くと「M-.」ですが,これは,直前のコマンドの最後の引数を貼り付けます.
補完とは違う機能ですが*2,便利な機能ですし,素早くミスなくコマンド入力ができるので,ぜひ使いこなしてください.
&&でコンパイルと実行
途中から,コンパイルと実行を,一つのコマンドでやっていました.
$ env LC_ALL=C gcc relatively_prime.c -o relatively_prime && ./relatively_prime
コマンドラインで使用する「&&」は,
- 「&&」の左までを,一つのコマンドとして実行しなさい.
- そしてそれが正常終了したら(終了ステータスが0なら),「&&」の右を,一つのコマンドとして実行しなさい.
- 正常終了でなければ(終了ステータスが0でないなら),「&&」の右は実行しません.
という意味です.Cの&&演算子に似ていますが*3,終了ステータスが0のときが真,0以外が偽に相当するのだけは注意です.
コンパイルで1回実行,「./実行ファイル」で1回実行すると,デバッグ,コンパイル,実行を繰り返すときは,シェルでのキーストロークは,↑↑Enter,↑↑Enter,…の繰り返しとなりますし,その途中にコンパイルエラーが入ると(デバッグしたつもりが構文エラーになった,などのとき),この周期でなくなって苦労します.
「&&」を使って一つのコマンドにすれば,あとのシェルの操作は,↑Enterだけでよくなり,コンパイルエラーがあっても,実行方法は変わりません.
さて,二つのコマンドを一つにする方法ですが,あらかじめ
$ env LC_ALL=C gcc relatively_prime.c -o relatively_prime $ ./relatively_prime
を順に実行した状態だとします.そこで↑を1回押せば
$ ./relatively_prime
となり,カーソルが右端に移動していますが,ここで,C-u(Ctrlを押しながらu)とすると,一瞬でコマンドが消えます.実はこれは,カットアンドペーストの「カット」をしたのです.では「ペースト」ですが,もう一度↑を押すと
$ env LC_ALL=C gcc relatively_prime.c -o relatively_prime
と出て,カーソルはやはり右端です.ここで,「 && 」はそのまま打ち込み,それからC-y(Ctrlを押しながらy)とすれば,
$ env LC_ALL=C gcc relatively_prime.c -o relatively_prime && ./relatively_prime
となります.Enterキーを押せば,このコマンドを実行し,そしてコマンドラインの履歴(ヒストリ)にも残ることになります.