わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

知っておこうコマンドライン操作3つ

昨日のエントリでも,いくつか便利なコマンド実行方法がひそんでいたのですが,一つ一つ解説すると長くなりますので,別にしました.

ファイル名の補完

リンクエラーに対処するでは,ファイル内の単語(識別子)の補完を取り上げましたが,別のキーストロークで,ファイル名を補完することができます.
先頭の何文字かを入力してから,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キーを押せば,このコマンドを実行し,そしてコマンドラインの履歴(ヒストリ)にも残ることになります.

*1:個人的にはこの補完を多用しています.タイプ数が減るだけでなく,ファイルが存在することを確かめられますので.

*2:個人的には,EmacsでのM-/と,シェルでのM-.をよく取り違えます.修行が足りませんね.

*3:コマンドラインで「||」も使用できます.これを使用する効果的な例は,思いつきませんが.