〇 GUIしか使えないのはアマチュア、コマンドライン習得でプロに近づく。
Linuxを使いこなす上で、絶対にマスターしておきたいのが「コマンドライン操作」だ。この特集では、コマンドライン操作に苦手意識を持つ人に向けて、「シェル」や「端末」などの根本的な仕組みからコマンド操作の基本や活用方法までを解説する。
Part1では、コマンドラインとは何か、コマンドライン操作を学ぶ意義や必要なソフトウエア、コマンドの種類などについて解説します。全体像をつかんでからコマンドライン操作を始めれば、操作について悩むことが減ります。
最近のLinuxディストリビューションは、Windowsのように、グラフィカルな画面上で主にマウスなどのポインティングデバイスを使って各種の操作をする「GUI(Graphical User Interface)」が充実しています(図1 )。その一方で、昔ながらの、キーボードから「コマンド」と呼ばれる文字列を打ち込み、それを実行することでさまざまな操作を実現する「CUI(Character User Interface)」あるいは「CLI(Command Line Interface)」も利用できます(図2 )。
図1、GUIが充実したUbuntuのデスクトップ画面。
図2、コマンドによる操作をするCUIも利用できる。
端末アプリ(後述)でコマンド操作をしている様子。
CUI(あるいはCLI)におけるコマンドを入力する場所のこと、あるいは入力したコマンド(行)のことを「コマンドライン」と呼びます。
Linuxの普及が始まった1990年代中盤には、まだGUI環境が十分整備されておらず、コマンドラインによる操作が主流でした*1 。しかし、1990年代後半から、統一感のあるGUIを備えたアプリ群で構成される「統合デスクトップ環境」と呼ばれるソフトウエアが普及し始めたことで、LinuxでもGUI操作が一般化してきます*2 。CPUやビデオカードの性能向上、主メモリー量の増加など、PCの資源(リソース)がリッチになり、GUIをストレスなく使用できる環境が整ってきたという要因もあります。
*1 GUIの提供基盤である「X Window System」は比較的早期から利用可能で、GUIアプリケーションもそれなりに使えました。しかし、操作の大半をGUIで実施するという状態ではありませんでした。
*2 現在も広く使われているオープンソースの統合デスクトップ環境「KDE」「GNOME」の開発が始まったのが1996〜1997年です。
コマンドライン操作の利点。
「GUIがあれば、古臭くて操作が面倒なCUIは必要なの?」と感じる人もいるでしょう。しかしGUIとCUIには、それぞれメリットとデメリットがあり、目的によって使い分けた方が効率的です。
GUIの利点は、CUIに比べて直感的な操作ができることです。それによって、コマンドを覚えていない人でも操作が可能です。その半面、快適なGUIを提供するには、CUIに比べてコンピュータに高い性能が要求されます。最近のPCは高性能なため多くの場合問題にはなりませんが、組み込み機器やサーバー機ではGUIが使えないことがあります*3 。また、PCをネットワーク越しにリモート操作する場合、GUIだと画面を転送するのに大量のデータをやり取りします。そのため、通信速度が低いと快適な操作ができません。
*3 小型コンピュータボードの「Raspberry Pi」シリーズでも、高性能な機種ではGUIを使うのが普通ですが、「Raspberry Pi Zero」などの低性能な機種では、今でもCUIのみを使うことが少なくありません。
また、Part3で紹介するように、コマンドライン操作は履歴が残ります。そのため、同じ作業を簡単に再現できます。Part5で紹介する「シェルスクリプト」を使用すれば、繰り返し処理や定時処理をするのも容易です。こうした点もCUIの大きな魅力です。
シェルがコマンドを解釈。
Linuxディストリビューションにおいて、コンピュータの資源の管理やファイルの管理、プロセスの管理、入出力の管理などの中核機能を提供するのは「カーネル」と呼ばれるソフトウエアです。ユーザーは、コマンドを実行することでカーネルにさまざまな仕事を依頼します。
しかしカーネルは、ユーザーが入力したコマンド(行)を直接解釈することはできません。コマンド(行)を解釈して実行するのは「シェル」と呼ばれるソフトウエアの役割です(図3 )。コマンドを解釈することから「コマンドインタープリタ」とも呼ばれます。このような役割を担うため、シェルはユーザーとカーネル間の仲立ちをする「インタフェース」であると捉えられます*4 。なお、Part5で解説するシェルスクリプトもシェルが解釈して実行します。
図3、ユーザーとカーネルの仲立ちをするシェル
ユーザーが入力したコマンドを解釈して実行するのがシェルの役割。ユーザーとカーネルの仲立ちをすると捉えられる。
*4 カーネルという言葉の元々の意味は、植物の種の内側にある仁(じん)のことです。そこから、カーネルを覆うインタフェースとなるソフトウエアのことを「シェル(殻)」と呼ぶようになりました。
Linuxでは一般にBashを利用。
シェルにはさまざまな種類があります。LinuxディストリビューションのようなUNIX系OSで利用できるシェルは、「sh系」と「csh系」の二つに大別できます。
sh系のシェルには、オリジナルのUNIX で使われていた「sh(Bourne Shell)」「ksh(KornShell)」や、shを大幅に機能強化した「Bash(Bourne Again Shell)」などがあります。また、シェルスクリプトを高速に実行する目的で作成された「ash(Almquist Shell)」や「dash(Debian Almquist shell)」もsh系です。
一方、csh系のシェルには、BSD UNIX で使われていた「csh(C Shell)」や、cshを大幅に機能強化した「tcsh」などがあります。
UbuntuなどのLinuxディストリビューションでは、一般にBashがユーザーのログインシェル として使われます。
現在使用中のシェルの情報は、echoコマンドを次のように実行して環境変数SHELLの値を見ると分かります。
Bashを使っている場合は「/bin/bash」のように、Bashの実行ファイルのパスが表示されます。
また、「/etc/shells」ファイルには、インストール済みで、ログインシェルとして使用できるシェルの実行ファイルのパスが列挙されています。
一時的にシェルを変更する場合は、ここに記述されているファイルを実行します*5 。例えば、dashに切り替える場合は次のように実行します。
元のシェルに戻るには「exit」コマンドを実行します。なお、ユーザーのログインシェルを変更する場合は「chsh」コマンドを次のように実行します。
*5 後述するように、環境変数PATHに設定されているディレクトリーにある実行ファイルであればファイル名だけで実行できます。
用語解説:UNIX 米AT&T社のベル研究所で1969年に開発が始まったOS。1980年代には教育機関に普及し、その後、ビジネス用途にも使われるようになった。
用語解説:BSD UNIX カリフォルニア大学バークレー校で開発されたUNIXの派生版。
用語解説:ログインシェル ユーザーがログインしたときに起動されるシェルのこと。
コマンド入力を促すプロンプト。
シェルは、コマンドの入力を促す「コマンドプロンプト」(以下、プロンプト)と呼ばれる文字あるいは文字列を表示します。最も単純な場合は「$」や「#」という文字をプロンプトとして表示しますが、プロンプト部分にさまざまな情報を表示するように設定することもよくあります。
例えばUbuntuの場合、「ユーザー名 @ホスト名 :カレントディレクトリー $」といった形式のプロンプトを表示するようにBashを設定しています。
なお、「ディレクトリー」とはファイルの入れ物となる記録装置上(ファイルシステム上)の仕組みです。GUIで「フォルダー」と呼ぶものと、おおむね同じです。ただし、フォルダーの方が概念が広く、記録装置上の仕組みとは直接対応しない入れ物も含みます。例えば、ネットワーク共有ファイルやファイルの検索結果などの入れ物をフォルダーとして取り扱うことがあります。
このようなプロンプトに続いてユーザーがコマンド(行)を入力し、最後に[Enter]キーを押すことで、そのコマンドが実行されます。
プロンプトの設定方法については、Part2で紹介します。
コマンドライン操作をする方法。
Linuxディストリビューションでコマンドライン操作をする方法は、主に三つあります。
一つは、「仮想コンソール」(図4 )と呼ばれるコマンドライン操作専用の画面を使う方法です。この画面は、GUI環境を提供する「ディスプレイサーバー*6 」と呼ばれるソフトウエアが稼働していない場合に表示されます*7 。
図4、仮想コンソールでコマンド操作をしている様子。
*6 Linuxディストリビューションで使われるディスプレイサーバーには、「Xサーバー」や「Waylandコンポジター」などがあります。
*7 GUI環境を利用していても、[Ctrl]キーと[Alt]キー、[F3]キーの同時押しなどで仮想コンソールを表示できます。しかし、キー割り当てが環境によって異なるなど、使い方がやや難しいのでここでは説明しません。
もう一つは、GUI環境でコマンドライン操作を可能にする「端末アプリ」と呼ばれるソフトウエアを利用することです。例えば、Ubuntuには「端末」(画面は図2を参照)という名前の端末アプリがデフォルトで用意されています*8 。
*8 正式名称は「GNOME端末(GNOME Terminal)」です。
端末は、Ubutuのアプリケーション画面にある「端末」アイコンをクリックすると起動できます(図5 )。アイコンを見つけられない場合は「gnome」や「term」というキーワードで検索するとよいでしょう。また、[Ctrl]キーと[Alt]キー、[T]キーを同時に押すことでも起動できます。
最後の一つは、「SSH(Secure SHell)」などのリモートログイン用プロトコルを有効にするサーバーをLinuxディストリビューションで稼働させた上で、Windows PCなどからリモートログインすることです。Windows PCからSSHを使ったリモートログインをする場合は、「Tera Term」(図6 )などの端末アプリがよく使われます。
図6、Windowsの端末アプリ「Tera Term」でUbuntuをリモート操作している様子。
コマンドには2種類ある。
シェルで解釈・実行されるコマンドには二つの種類があります。
一つは、シェルの内部に実装されているコマンドです。このタイプのコマンドは「(シェルの)組み込みコマンド」などと呼ばれます。利用できる組み込みコマンドやその機能は、シェルによって異なります。Bashで利用できる組み込みコマンドには、カレントディレクトリーを変更する「cd」、カレントディレクトリーを表示する「pwd」、文字列を表示する「echo」などがあります。Bashで利用できる組み込みコマンドの一覧は「help」コマンドを実行すると表示されます。
もう一つは、実行ファイルの形で用意されているコマンドです。このタイプのコマンドは「外部コマンド」などと呼ばれます。外部コマンドの実行ファイルは通常、「/bin」「/sbin」「/usr/bin」「/usr/sbin」といったディレクトリーに格納されています。
外部コマンドの実行ファイルのパスは、コマンド名を引数に指定して「which」コマンドを次のように実行すると分かります。
この場合、ファイル一覧を表示する「ls」コマンドの実行ファイルのパスが「/usr/bin/ls」であることが分かります。
組み込みコマンドが優先。
同じ名前のコマンドが、組み込みコマンドと外部コマンドのどちらにも用意されていることがあります。例えばUbuntuでは、前述した組み込みコマンドのechoのほか、同じ機能を提供する外部コマンドが「/usr/bin/echo」として用意されています。
この場合、「echo」コマンドを実行すると組み込みコマンドの方が優先的に実行されます。外部コマンドを実行したい場合には、次のように実行ファイルのパスを指定します。
外部コマンドの検索。
組み込みコマンドには存在しないコマンドが実行された場合、シェルはそれに対応する実行ファイル(コマンド名と同じ名前の実行ファイル)を、環境変数PATHに設定されているディレクトリー群の中から検索します。
環境変数PATHの値を次のようにechoコマンドを実行して表示してみましょう。
このように環境変数PATHには、ディレクトリーのパスをコロン「:」区切りで列挙したものが格納されます。シェルはそれらのディレクトリーを先頭(左側)から順に検索して、最初に見つけたものを実行します。