シェル:UNIXの基本かつ最も大切な機能

 ログインしたら,多くの場合には,以下のようなプロンプトが表示される。

[ユーザー名@ホスト名 ホーム・ディレクトリ名]$

 このプロンプトは,シェルというアプリケーションが表示している。シェルは基本的にユーザーが入力したコマンドを解釈し,必要に応じてそれをLinuxカーネルに引き渡す。そして,Linuxカーネルは送られてきたコマンドに応じて,アプリケーション起動など指示された処理を実行する。Linuxカーネルが実行した結果は,シェルを通してユーザーに返される。

 WindowsやMacintoshでは,ほとんどすべての作業がGUI(グラフィカル・ユーザー・インタフェース)上で行われる。UNIX系OSでもGUI環境の充実によりマウスを使って各種操作が行えるようになった。しかし,UNIX系OSの場合は,まだ多くの操作がこのシェル上で実施されている。慣れてしまえば,GUIによる操作よりも便利かつ効率が良いためである。

 「Linuxはリモート管理能力が優れている」などと言う人が多い。これは,telnet(テルネット)と呼ばれる,ネットワーク上の別のコンピュータにログインしてシェルを起動して遠隔操作できるようにするソフトがUNIXには標準搭載されていることを言っているのである。

 シェルには,いくつか種類がある(表3)。Linuxでは,Bourneシェル(Bシェル)を拡張したBash(Bourne Again SHell)が一般的に利用されている。

表3●主なシェル
表3●主なシェル

リダイレクトとパイプ

 シェル上で実行されるコマンドの入出力先は,「標準入力」と「標準出力」である。通常,標準入力はキーボードに,標準出力はディスプレイに割り当てられている。この入出力先はファイルや別のコマンドなどに切り替えられる。

 入出力先をファイルに切り替える際は,リダイレクトと呼ばれる機能を用いる。リダイレクトの指示には,“>”,”<”などの記号を使う。例えば,lsコマンドの実行結果をファイル(test.txt)に出力したい場合には,

$ ls > test.txt

 と入力する。ファイル(test.txt)の内容を読み込んで,データの行数,単語数,文字数を数えるには,

$ wc < test.text

 を実行すれば良い。このようにリダイレクトを使えば,簡単に標準入出力先を変更できる。

 また,あるコマンドの出力結果を,別のコマンドの入力として流用したい場合は,パイプと呼ばれる機能を用いる。パイプの指示には,“|”という記号が使われる。パイプで複数のコマンドをつなぐことにより,複雑な処理であっても中間結果を保存しておくファイルを作成することなく実行できる。

 例えば,lsコマンドの結果の中から“linux”という文字列を含むファイルやディレクトリだけをディスプレイに表示するには,

$ ls | grep linux

と入力すれば良い。この場合は,まずlsが実行され,その出力結果からlinuxを含むファイルやディレクトリだけがgrepにより抜き出されて標準出力に送られる。パイプで3個以上のコマンドをつなげることもできる。

シェルによるプログラミング

 シェルは,単にユーザーのコマンド入力を受け付け,その結果を表示する機能以外に,「シェル・スクリプト」というプログラムの解釈機能も持っている。例えば,下記の2行はシェル・スクリプトである。

#!/bin/bash echo 'Hello World'

 1行目は,「これはBashシェルのプログラムである」ことの宣言である。こうした宣言がないスクリプトは,Bourneシェルで実行される。そして2行目は,「Hello Worldという文字列を標準出力に送れ」との指示である。

 このスクリプトを実行するためには,実行可能であるという権限をこのスクリプト・ファイルに設定しておく必要がある。ファイル名を“test”とすると,

$ chmod +x test

 で実行権限を与えられる。読み出し権限は編集時に自動的に設定されるので,改めて設定する必要はない。実行方法は,以下の通り。

$ ./test Hello World

 ここでは,最も基本的なechoコマンドを利用したスクリプトを紹介したが,システム管理にも使える複雑で本格的なプログラムも記述可能である。