Linux道場入門編
第9回シェルとコマンド実行
今回はシェルとコマンドについてのお話です。前回パスのお話をしましたが、もう1つコマンド実行を考える際に重要な要素があります。それがシェルです。シェルはコマンドを実行するソフトウェアでもあり、LinuxのCUIの実態でもあります。コマンド実行はこのシェルを介して行い、Linuxを操作する上においてシェルは必要不可欠な存在だといえます。シェルは基本的にコマンドを実行に必要な機能を提供するものですが、現在のシェルには様々な機能がついており、それ単体が非常に高機能なソフトウェアである場合もあります。ここでは基本としてコマンドを実行することにフォーカスしてシェルの役割やコマンド実行に必要なシェルの知識についてお話します。
シェルとは
第四回の「LinuxとH/W」の回でOSの役割の1つにH/Wの抽象化があるというお話をしました。このOSの機能によりH/Wを有効活用することができます。しかし実際にOSの機能を利用しようとした場合にまだ障害があります。OSはH/Wの抽象化の機能を提供しますが、実はそれをユーザが操作することに対しての機能までは提供していません。例えばファイル操作のような機能に関してもOSは記録装置上のデータは管理していますが、それをユーザレベルで操作することはOSの機能とはまた別の話なのです。実際にはそのような機能はほとんどの場合、OSと一緒に提供されていますのでそれが別ものであるという認識はあまりないかもしれません。このようなユーザレベルでOSの機能を操作するS/Wをシェルといいます。シェルはユーザとOSの間に立ちユーザの入力をOSに伝え、OSの処理の結果をユーザに伝えます。
以上のようにシェルの名前はOSの核であるカーネルを覆い隠している姿がシェル(貝殻)のようなところにその由来があります。つまりシェルとはカーネルとユーザとを結ぶインターフェイスの役割を果たし、ユーザの操作をOSに対して伝える役割があります。実際のユーザの操作はコマンド実行というものになり、そのコマンドを入力、実行、結果の出力を行うのがシェルの大きな役割の1つということになります。
- ※Windowsでいうとコマンドプロンプトのイメージになりますが、エクスプローラもシェルの一種といえます。
コマンドの概念
コマンドはシェルからOSの操作を行うための命令と例えることができ、コマンドをシェル上で実行することによってそのコマンドがLinuxに対して何らかのかたちで作用します。例えばファイルやディレクトリの一覧表示を行うための「ls」というコマンドがあります。lsコマンドを実行することにより OSが管理しているファイルやディレクトリの一覧を取得し、シェルを介して画面に出力します。この場合lsコマンドを実行してユーザがOSの機能を操作していることになります。このようにコマンドはOSに対する命令と考えることができ、コマンドを使うことによって様々な操作を行っていきます。これが WindowsなどのGUIの場合、ファイルやディレクトリの一覧表示はフォルダをクリックすればその中身がグラフィックとして自動的に表示されるのですが、CUIの場合は一覧表示を行うという命令を明示的に与えてやらなければ何も行なわれません。
このようにGUIの操作では当たり前であったものが、そうではなくなります。一見すると煩雑な作業に見えますが、使いこなしていくうちに強力なインターフェイスとなります。
では、実際にコマンドを実行する部分を考えて見ます。コマンドの入力はシェル上にプロンプトといわれているものが表示されている状態からおこないます。プロンプトはコマンドの入力の待ち受け状態をあらわし、コマンド実行後にプロンプトが表示されていない状態はコマンドが実行され続けていることになります。
[user@hi ~]$ ←プロンプト(入力待ち受け状態)
コマンドの基本的な実行はプロンプトからコマンド名を入力し、Enterキーを押すことで実行になります。コマンド入力には基本となるフォーマットがあり、そのフォーマットに従って入力をおこないます。基本フォーマットは以下のようになります。
コマンド名 [オプション...] [引数(パラメータ) ...]
- ※上記はあくまで基本です。コマンドによってはこのような形態にならないものも多く存在します。
上記の項目で特にオプションは重要です。コマンドは基本的に1つの機能しか持っていません(UNIXの思想的に)。この1つの機能に付加的な要素を加えるのがオプションの役割になります。オプションを指定することによってコマンドの動作に変化を与えたりすることもできます。Linuxで利用されるコマンドのオプションには大きく以下の3つ形式が存在します。
形式 | 内容 |
---|---|
Unix98形式 | 先頭にハイフン(-)をつけて、複数をまとめて指定する |
BSD形式 | 先頭に何もつけずに複数をまとめて指定する |
GNU形式 | 先頭にハイフン2つ(--)を付けて長い名前のオプションを指定 |
以上のオプションの指定はコマンドによってことなるため、コマンドで指定できる形式をわたす必要があります。LinuxではUNIX98形式かGNU形式のオプションをわたすコマンドが多いようです。
コマンドがある機能を実現するものならば、引数はそのコマンドを実行する対象ともいえます。引数の指定はする場合としない場合がありますが、どういった引数を指定するかはコマンドに依存します。例えば以上のフォーマットにしたがって、lsコマンドにオプションを指定する際には以下のようになります。
[user@hi ~]$ ls -l .bash_profile
以上はlsというコマンドにUnix98形式のオプション-lを指定し、引数に「.bash_profile」を与えています。これは.bash_profileというファイルの表示を詳細に行うことを意味します。
コマンド実行のタイプ
シェルによるコマンド実行にはいくつかのタイプが存在します。このタイプによって実はシェルの中でコマンド実行されるフローが異なります。コマンド実行のタイプは大きく以下の3つに分けることができます。
- シェル自体に組み込まれている組み込みコマンド
- 環境変数PATHにパスが指定されているディレクトリ内の実行可能ファイル
- パス指定(相対、絶対)を含む実行可能ファイル
Aはシェル自体が内部的に持つ機能である組み込みコマンドを呼び出していることになります。「cd」などはシェルの組み込みコマンドの代表的なコマンドです。Bは環境変数PATHの情報をシェルが参照し、その中に設定されている場所から指定された実行可能ファイルを探し出して実行します。Cは実行可能ファイルをパスを含む形で指定をすることによって、指定した場所の実行可能ファイルを実行することになります。このことからコマンドとは基本的にシェルの組み込みコマンドと実行可能ファイルの呼び出しの2つ系統のどちらかということになります。
シェルの便利機能
シェルには以上のような基本機能とそれ以外にユーザの入力を手助けする機能があります。例えばコマンドやパス名などを補完してくれる入力補完機能、ユーザの入力履歴を保存し、それを自由に再利用できる履歴機能、キーボード操作を軽快に行うための、キーバインド機能などコマンド実行にあると便利な機能を提供してくれています。このような機能を駆使することにより、一見煩雑なコマンド操作を快適にすることができ、GUIにはない強みを発揮することができます。なれない人にとっては大変かもしれませんが、習熟によって操作性や速度などが変化してくるのもコマンド実行(CUI)の魅力かもしれません。
コラム執筆/末永 貴一
株式会社エイチアイ研究開発部 部長
ヒューマンインターフェイスの研究開発、コンテンツの開発を行う株式会社エイチアイで次世代技術の研究開発を行う業務を担当している。 オープン系のシステム開発事業、教育事業を経て、自社独自の組込み機器向け3DリアルタイムレンダリングエンジンであるミドルウェアのMascotCapsuleを中心とした開発に従事した。数年前にLinuxを知ってからはサーバ構築、開発、教育、執筆などさまざまな場面で関わるようになり、現在では組込み開発でもLinuxを利用することもある。