業務で使用するLinuxは、Linuxサーバの形態であることが多い。オンプレミスでデプロイされていることもあれば、クラウドにホスティングされていることもある。手元の作業PCの仮想環境にインストールされていることもあるだろう。どのケースでも、手元のPCやMacからSSH経由でログインして使うことが多いはずだ。
SSH経由でログインして使用するということになると、操作面で使うことが多くなってくるのはインタラクティブシェルだ。業務で使われることの多いLinuxディストリビューションのほとんどは、デフォルトのインタラクティブシェルとして「bash」を採用している。つまり、Linuxを使っている管理者の多くが普段からbashを使っていることになる。
本連載ではこれまで長期に渡り、エディタ「Vim」の使い方を説明してきた。VimはLinuxを管理する上で重要なエディタであり、利用スキルが向上するほど高速にテキストを編集できるようになるからだ。
そして、それはインタラクティブシェルにも同じことが言える。Linuxで使われることが多いインタラクティブシェルは、「Tab」キーを押すだけである程度の入力を補完してくれるのだが、当然これ以外にも多くの機能が提供されており、ショートカットキーも多数用意されている。それらのショットカットキーを使いこなすと、インタラクティブシェルの使用効率がまた違ってくる。
また、インタラクティブシェルにはショートカットキー以外にも作業を高速化するための多くの機能が用意されている。今後はこうした機能を整理しながら取り上げ、Linuxにおける作業を高速化する方法に取り組んでいく。
bash
歴史的な経緯は省くとして、現在Linuxディストリビューションでデフォルトのインタラクティブシェルとして最も普及しているのがbashだ。シェルとしては「Bourne Shell」と呼ばれる初期インタラクティブシェルのシンタックスの系列のシェルにあたり、Bourne Shellにインタラクティブに操作するときの便利な機能や、プログラミング言語としての機能を追加したような内容になっている。
Linuxを使っていくのであれば、とりあえずbashの使い方を習得すれば間違いない。システムを管理するためのシェルスクリプトもbashを使って開発されているか、オリジナルのBourne Shellに近い機能だけを使って開発されていることが多いため、基本的にbashが使えればシステムのシェルスクリプトも読むことができる。知っておいて損はない。
bashのようなインタラクティブシェルを深く極めていくことは、Linuxカーネルの提供するシステムコールに関する理解を深めることにもつながる。「そこまでする気はない」という方がいるのもよくわかるのだが、ある程度深くまで掘り下げて学ぶと、Linuxカーネルの内部の動きを想像しやすくなる。Linuxサーバの運用/管理のエキスパートになる上で、便利な方法の一つでもあるのだ。
zsh
基本的には、bashについて知識とスキルを身に付ければよいのだが、多機能インタラクティブシェルとして押さえておきたいシェルに「zsh」がある。「AppleがmacOS Catalinaからデフォルト採用したインタラクティブシェル」と言えば、興味が湧くのではないだろうか。AppleはこれまでmacOSのデフォルトインタラクティブシェルを何度か変更している。しばらくbashがデフォルトのインタラクティブシェルだったが、macOS Catalinaからはzshに変更となった。気が付かなかったユーザーも多いと思うが、これも知っておいて損のないインタラクティブシェルだ。
こちらも歴史的経緯は省くが、zshが提供している機能はbashが提供している機能とよく似ている。zshが登場した当初はbashよりも多機能なインタラクティブシェルという側面が強かったが、bashもその後機能追加を繰り返しており、現在ではそこまで大きな違いを感じることは少ないはずだ。bashもzshもよく似たものだと考えておいてよいと思う。
zshもBourne Shell系のシンタックスをベースとしたインタラクティブシェルであり、立ち位置はbashとよく似ている。ただし、bashがBourne Shellに拡張機能を追加しているように、zshもBourne Shellに拡張機能を追加したような作りになっており、この拡張機能の部分には細かい違いがある。このため、ゴリゴリにbashの拡張機能を使って記述されたシェルスクリプトは、そのままではzshでは使えないことが多いと思う。その逆もまたしかりだ。
それほど深く使っているのでなければ、bashとzshにさほど違いを感じることはないと思うが、もし使っている作業マシンがMacだというのなら、Linuxサーバのインタラクティブシェルをzshに変更して、LinuxサーバもMacもzshを使うというのは悪くない選択肢だ。同じシェルを使っているほうが何かと便利なのは間違いない。
現在におけるbashとzshの大きな差は、ライセンスということになるだろう。bashはGPL系で、zshはBSD系ライセンスだ。アプライアンスや組み込みデバイスのベンダの中にはGPLを避ける向きもあり、そうした場合にはbashではなくzshが使われるということもあるようだ。
fish
インタラクティブシェルで1つ紹介しなければならないのは「fish」だ。インタラクティブシェルとしてはかなり後発なソフトウエアに分類される。現在使われているインタラクティブシェルの多くがBourne Shell系のシンタックスを採用したのに対し、fishは独自のシンタックスを採用している。一部はBourne Shellと同じなので普段使い程度では違いを感じないと思うが、fishでシェルスクリプトを組もうとするとその違いを認識できるはずだ。
fishは何がすごいかと言えば、何もしなくて良い点がすごい。bashやzshはそもそもの発生が古いソフトウエアということもあり、便利な機能を使う場合にはある程度設定ファイルを書く必要がある。もともと(現在と比較して)コンピュータリソースの乏しい時代に開発されたものなので、コンピュータリソースを消費するリッチで便利な機能はデフォルトでは無効化されているのだ。
fishは、bashやzshよりもコンピュータリソースがかなり豊富な時代に開発されており、最初から全ての機能が有効化されている。補完機能も文脈を加味していい感じに行ってくれるので、ユーザーはあまり考える必要がない。正直なところ、効率の良いインタラクティブシェル操作を身に付けるなら、まずシェルをbashからfishへ変更すると良いと言いたい。
ただ、fishは文法が完全にBourne Shellに基づいたものではないため、システムのシェルスクリプトを読んだりするには、やはりbashを学んでおいたほうが良いのだ。すでにある程度Bourne Shellをマスターしているということであれば、次の手段としてfishに移るのはありだろう。最初からfishを使うと、Bourne Shellを読み書きするスキルが身に付かないので後々、苦労するのではないかと思う。
しかし、fishの楽さは魅力だ。Bourne Shell系のシェルスクリプトの読み書きはしないと割り切ってしまうなら、最初からfishを使うのも悪くない。補完候補も薄字で誘導的に表示してくれるし、操作方法は「Ctrl」+「F」だけ覚えておけばよい。一度使い出したら戻れない便利さだ。
シェルを学んでLinuxの操作効率アップ
インタラクティブシェルについて、どこから取り組んでいくかは難しい問題だ。教科書的に取り組んでいってもよいのだが、本連載では実際によく使う機能からピックアップし、徐々に掘り下げていくかたちでインタラクティブシェルやシェルの機能を紹介していく。
シェルは知れば知るほどいろんな応用ができるソフトウエアだ。最近はWindows 10でもWSL経由でLinuxが使用できるので、インタラクティブシェルも日常的に利用できるようになってきている。これを使わない手はない。
それに、ここで身に付けた知識やスキルはMacでもそのまま使用できる。Linuxのみならず、Windows 10やmacOSでも活用できる能力が手に入るのだ。これは割の悪い勉強ではないと思うので、ぜひ本連載を読みながら、一緒に取り組んでみていただきたい。