コーダーなら知っておいて損はない CUI にまつわるエトセトラ その2

スタッフブログ

皆様どうも、こんにちは!
こまりのソフトウェアエンジニア、桑木です。

前回の記事では、CUIのもっとも基礎的な使い方について説明しました。インターネットによくある手順書的な記事を試してみるくらいは、かろうじてできるようになったのではないでしょうか。

今回は前回説明できなかった基礎と、その他Tipsを書いていきたいと思います。

この記事ではbashを想定していますが、同じようなことはWindowsのコマンドプロンプトやPowerShellでもできると思います。

コマンドの出力をファイルへ書き込む(リダイレクト)

コマンドを実行すると何かしら画面に出力されることがあります。処理の内容だったりコマンドの実行結果だったり、その内容はコマンドによって様々です。そんな出力をファイルに保存することができます。

コマンドの後ろに>記号とファイル名を指定して実行すると、画面への表示はされずに表示されるはずの内容が指定したファイルに書き込まれます。これをリダイレクトと言います。

$ [コマンド] > [出力先のファイル名]

>記号でリダイレクトすると出力先のファイルが既にある場合は上書きされます。代わりに>>記号を使用すると追記させることができます。また、逆に<を使用することでコマンド実行中のキーボード入力の代わりにファイルの中身を入力させることもできます。

コマンドの出力を他のコマンドに入力する(パイプ)

リダイレクトはファイルに対して入出力しましたが、他のコマンドに対して入出力することもできます。

コマンドの後に|記号と他のコマンドを指定して実行すると、前のコマンドの出力が後のコマンドの入力になります。これをパイプとかパイプラインと呼びます。

$ [コマンド1] | [コマンド2]

コマンドの「出力」はパイプやリダイレクトを指定しなければ通常は画面に出力されます。同様に、コマンドの「入力」は特に指定しなければキーボードから入力を受け付けます。つまりコマンドの入力は、キーボードから入力させることもできるし、リダイレクトでファイルから入力させることもできるし、パイプで他のコマンドから入力することもできることになります。

実はCUIには、パイプで入力することが前提のコマンドが多くあります。例えばmorelessコマンドは入力をそのまま出力するコマンドですが、出力が1画面を超える直前で一時停止してくれます。大量の出力があるコマンドからパイプで入力すれば、1画面ずつ表示させることができて便利です。

他にも入力をフィルタリングして出力するgrepコマンドや、文字列の置換えをするsedコマンドなどは有名です。

ls -l /の出力をgrepコマンドに入力して、srが含まれる行だけを表示させた例です。

$ ls -l / | grep sr
lrwxrwxrwx.   1 root root      7  5月 23  2018 bin -> usr/bin
lrwxrwxrwx.   1 root root      7  5月 23  2018 lib -> usr/lib
lrwxrwxrwx.   1 root root      9  5月 23  2018 lib64 -> usr/lib64
lrwxrwxrwx.   1 root root      8  5月 23  2018 sbin -> usr/sbin
drwxr-xr-x.   2 root root   4096  4月 11  2018 srv
drwxr-xr-x.  13 root root   4096  5月 23  2018 usr

コマンドの履歴

一度実行したコマンドを再度実行したい、もしくは一部だけ修正して実行したい。ということは頻繁にあります。

そんな時はキーボードの上下キーを押すことで、過去に実行したコマンドを入力することができます。もちろん、そのまま過去のコマンドが入力された状態でEnterキーを押せば実行できますし、一部だけ修正してから実行しても良いです。

bashには、historyコマンドとか!とかCtrl+Rとか贅沢な機能もありますが、とりあえず上下キーだけ覚えておけばあまり不便はないと思います。

ただし、あまりにも同じコマンドばかり使う場合は、この履歴機能よりもスクリプトを使う方法も検討した方が良いと思います。

パラメータの補完

コマンドのパラメータにファイル名を指定することは多いと思います。コマンド名はかなり簡略化されているものが多いですが、ファイル名となると分かりやすさ優先の長い名前にしていることでしょう。

しかし、GUIならマウスで選ぶだけで済みますが、CUIではファイル名を正確に入力する必要があります。大変ですね。

というわけで、ファイル名を途中まで入力したらTabキーを押してください。候補が1つだけならそのまま最後まで補完入力されます。候補が複数あるならTabキーをもっと押してください。候補がリスト表示されるので、候補が絞り込めるところまで続きを入力してTabキーでまた補完すれば良いでしょう。

あとはOSなどで提供されている機能について知るべし

CUIはあくまでOSとやり取りするためのUI(ユーザインタフェース)でしかありません。しかも、CUI自身の機能といえばコマンドを実行することと、コマンドの入出力を制御することだけです。コマンドの実行を自動化するスクリプト機能など付随する機能もありますが、本質的には前述の2つだけです。

CUIには色々なコマンドがありますが、基本的にOSやサービスの各機能を操作するために用意されています。つまり、機能を知り、機能を操作するコマンドを知れば、やりたいことが実現できるでしょう。