コマンドラインのいいところは、ちょっとした作業のほとんどをコンソールの中で済ませられる点だ。たとえば、16進数の3Eと10進数の23を足したものを2進数で表示、などという計算でも、
echo "obase=2;$((0x3E+23))" | bc #bash
[convert]::ToString(0x3E+23,2) #powershell
といった感じですぐに計算できる(cmd.exeは“set/a 0x3E+23”で計算は可能だが、2進数には変換できない)。計算を繰り返すようなら、関数やスクリプトを定義すればもっと短くできる。しかし、上記のPowerShellのコマンドなら補完機能で入力は比較的簡単だ。また、一回実行すればヒストリ(コマンド履歴)が残るので、履歴検索やカーソルキーなどで履歴を呼び出して書き直せば、繰り返しは簡単だ(bashなどは終了させても履歴は消えない)。
こういうとGUIのメリットはないのか? と思われるかもしれないが、GUIの中で端末エミュレータ(コンソールプログラム)を使うことほど便利なものはない。なぜなら、コンソールプログラムをマルチウィンドウで表示できるからだ。最近の端末エミュレーターは、複数のセッションをタブで1つのウィンドウにまとめて表示することもできる。さらには、1つのタブをペインに分割して別のセッションを起動することもできる。作業の途中にちょっとした計算がしたいときも、ウィンドウをペインに分割、そこで計算して結果をみながら、プログラム編集といったことも可能になる。こうやって複数のウィンドウ、複数のタブ、複数のペインを使うことで作業を効率的に行える。
多くのことが可能になったのは、物理端末制御用に作られたエスケープシーケンスが、端末エミュレータープログラムでも拡張され続け、GUIアプリである端末エミュレーターを高機能化していったからである。端末エミュレータープログラムはGUIアプリケーションなのでマウスクリックやホィールなどのイベントも受け取ることが可能だ。これをエスケープシーケンスやキー入力として端末エミュレーターの中で実行しているシェルやアプリケーションに送ることで、マウスに反応できるアプリケーションを作る、あるいは既存のアプリケーションをマウスでも操作できるようになっている。
別ウィンドウを開いてコマンドを実行させる
筆者は、このところメインの端末エミュレーターとしてWindows Terminalを使っている。高機能なアプリケーションで、最近搭載された機能にコマンドラインからウィンドウを指定して制御する機能がある。cmd.exeから
wt.exe -w test new-tab wsl.exe
とすると、新規にWindows Terminalが開く。このコマンドをもう一回実行すると、2つめのタブが開く。このウィンドウにはtestという名前がついている。ウィンドウの名前を確認するには、Ctrl+Shift+Pでコマンドパレットを開き「ウィンドウの識別」を実行する(写真01)。また、コマンドラインで-wオプションを使ってウィンドウ名を指定しなかった場合でも、コマンドパレットから「ウィンドウの名前を変更...」を実行すると、新しい名前を入力する小さなダイアログが開く。
wt.exeの-wオプション(ロング形式では--window)で名前を指定すると、起動オプションはすべて指定したウィンドウで実行される。ただし、WSL側ではちょっと事情が違う。というのは、Windows TerminalはUWPアプリケーションなので、wt.exeは実行ファイル名ではなく、「アプリ実行エイリアス」である。このため、WSL側からwt.exeを直接起動することができない。
UWPアプリは、COMインターフェースを通して起動され、通常のアプリのように起動できない。しかしアプリ実行エイリアスが設定されたUWPアプリは、cmd.exeやpowershell.exeなどのWindowsのシェル側で特別扱いされて起動している。このため、WSLから、cmd.exeを起動し、これにwt.exeを実行させると、うまく動く。たとえば、
cmd.exe /c "wt.exe -w man wsl.exe -- man bash"
とすると、新しいWindows Terminalウィンドウが開いてそこでWSLが起動、“man bash”が実行される。こういう形で同時に表示させておきたい端末ウィンドウを別に開くことができる。しかも、以後同じ、「-w man」を指定してやれば、新しく開いたウィンドウにタブが追加される。これでmanの実行結果をタブで切り替えて見ることができるようになる。スクリプトにするなら、
cmd.exe /c "wt.exe -w $1 --title "$1 $2" wsl.exe -- $*" 2>/dev/null
などとしてエラーメッセージを出さないようにして、スクリプト化する。
このコマンドで別ウィンドウを開くと、フォーカスはマニュアルを表示しているWindows Terminalウィンドウに切り替わるが、Alt+Tabキーでもとのウィンドウに戻ることができ、ウィンドウ間を移動するのにマウスは不要である。
ペイン分割なら、Windows Terminalのキー割り当てで行える。設定をカスタマイズすれば、1キーでウィンドウを分割して現在と同じシェルを立ち上げることもできるようになる。片方でvimなどのエディタが動作していても、ペイン分割により表示エリアが縮小されたことをWindows Terminalがvimに伝え、そのまま編集を続けられる。
コマンドラインは、高機能な端末エミュレーターと高機能なシェル、そして多数のコンソールアプリがあり、どれも、まだ進化し続けている。bash Ver.5.1のリリースは、2020年の12月だ。昔からあるキャラクタ・ユーザーインターフェースだからといって「古い」ままというわけではない。