Linuxの中でシェルスクリプトはネットワークの設定、デーモンの起動など重要な役割を果たしています。この連載では、シェルスクリプトで実用的なプログラムを組むことを目標にして、シェルの基本的な知識を説明していきましょう。
Linuxにおけるシェルとは、WindowsにおけるMS-DOSプロンプト(command.com)に近い位置づけのものです。そもそも「シェル」とは一体なにものなのでしょうか?。UNIXでは「シェル=コマンドインタープリタ」とされています。日本語でいうと、「命令翻訳者」とでもいうのでしょうか。つまりシェルとは、「与えられた文字列」を翻訳し、コマンドやアプリケーションを起動するようプログラムされている「ソフトウェア」なのです。
実際にシェルの働きは次の画面で確認できます。
これはLinuxにログインしたばかりの状態です。プロンプト(上記の例では[redhat@ampan redhat]$ )が表示され、ユーザーの入力待ちとなっています(Linux起動後、Xウィンドウがいきなり起動されるようになっている人は、メニューから「シェル」、もしくは「コマンドツール」を起動してみてください。同じ画面が現れるはずです)。
この入力を待っているものが「シェル」そのものなのです。シェルも上記で書いたように1つのソフトウェアです。特にほかのコマンドなどと比べて特別なものではありません。ただ、通常Linuxにログインしたときには自動的に起動されるようになっているのです。
シェルにはコマンドの与えられ方によって、2つの大きな顔があります。1つは上記のように、ログインしたあとにプロンプトを表示し、入力待ちをしている状態、つまり、ユーザーによって入力された文字列を解釈し、コマンドを実行する顔です。この状態をインタラクティブモードと呼ぶこともあります。
もう1つの顔は、複数の命令を連続して実行するシェルスクリプトを実行するという面です。シェルスクリプトとは、MS-DOSではバッチコマンド(拡張子.bat)に相当します。Windows 95の登場以降、MS-DOSプロンプトやバッチコマンドはほとんど使われなくなりました。しかしLinux上におけるシェルは現在でもシステムの中核を担うものであり、今後ともその役割が低下することはまずありません。これはこの2つめの顔である「シェルスクリプト」の役割がLinux(あるいはUNIX)の中で非常に大きいからです。シェルスクリプトはOSが起動された後、ログインプロンプトがでてくるまでに、さまざまなプロセスを起動するのにも使われていますし、そのほかシステムのさまざまな部分でも使われています。
例えば次のシェルスクリプトを見てください。このファイルはLinuxをインストールした場合、通常自動的に作成されるファイルです(ディストリビューションによっては以下のファイルは存在しません。ここではredhat Linuxを例にします)。
$ more /etc/rc.d/rc.sysinit #! /bin/sh # # /etc/rc.d/rc.sysinit - run once at boot time # # Taken in part from Miquel van Smoorenburg's bcheckrc. # # Set the path PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH # Read in config data. if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network else NETWORKING=no HOSTNAME=localhost fi ……以下省略……
なにやらいろいろな命令が並んでいますね。ネットワークの設定を行ったり、sendmailを起動したりswapを設定したり……。Linuxの中ではこのようなプログラムの実行もほとんどすべてシェルスクリプトで書かれています。シェルスクリプトが理解できるようになると、自分の好きなようにシステム設定が可能となります。ただし上記でも書いたとおり、シェルはあくまでもLinuxというOS上で起動する1アプリケーションであり、OSの一部ではないことを理解しておいてください。
最近ではXウインドウマネージャーがずいぶん充実してきていますが、シェルの1つ目の顔である、インタラクティブなプログラムランチャーとしての(プロンプトの)顔もLinuxの文化であり、簡単にはなくなることはないでしょう。そして、2つのどちらの顔の場合も、シェルのもともとの役割(機能)は、プログラムを起動することです。1つめの顔の場合は、ユーザーが入力したコマンドを解釈し、プログラムを起動します。2つめの顔の場合は、シェルスクリプトファイルの中身を読んで解釈し、1行1行順番にプログラムを実行していきます。シェルにはスクリプト用にいくつかの制御コマンド(if文など)が用意されていますが、これらもプロンプトからインタラクティブに実行できないことはありません。内部的には同じ処理をしているのですから。上記2つの顔の違いはあくまでも、コマンドの取り込み方の違いだけなのです(もちろん細かい部分において2つのあいだに違いはあります。
例えばコメントの扱いについて若干の違いがあります)。
UNIXにおけるシェルは、大きくわけて2系統あります。sh(ボーンシェル)とcsh(シーシェル)です。ボーンシェルはcshと比較してよく“ビーシェル”などと愛称で呼ばれたりしますが、名前のボーン(Bourne)の由来は作者の名前です。cshはC言語に似せた制御コマンドをもつシェルとして登場しました。その後sh/cshの派生、機能拡張されたシェルがいろいろと登場いたしました。私の知っている範囲でも、列挙してみると、sh csh ksh bash tcsh zsh ash……と数多くあります。どれを使用するかは、好みや周りの人たちの環境により大きく左右され、一概に優劣はありませんが、Linuxでは多くのディストリビューションでbash(ボーンシェルを機能拡張したもの)が標準でセットされていること、機能的にも大変すぐれていていることもあり、現在はこのbashが事実上のlinux標準といっていいでしょう。このコラムでも今後bashを中心に書いていきたいと思います。
bashの名前は「Bourne Again SHell」から来ており、同名のGNU のプロジェクトにより作成されました。事実上は、商用UNIXで今でも比較的よく使われているkshのフリーソフトウェア版と言えるかもしれません。ですが、bashはボーンシェルの系統のシェルではありますが、cshも含めたのほかのシェルの良いところが複合された総合シェルともいうべきものになっています。具体的にはcshが持っていたエイリアス機能やヒストリ機能が取り込まれています。
Linuxを標準でインストールした場合は、ほとんどの方がbashを使用する環境になっていると思いますが、もしなっていない場合は、以下のようにしてログインシェルを変更することができます。ただしログインシェルを変更するのは、失敗すると次回からログインできなくなったりする危険性もありますので、慎重に、できればスーパーユーザーの方に相談してやったほうがよろしいでしょう。またrootユーザーのログインシェルはかえないほうが安全です。
ログインシェルを変更してみる $ chsh Changing shell for redhat. Password: New shell [/bin/csh]: /bin/bash Shell changed.
プロンプトからchsh(チェンジシェル)コマンドを実行してみてください。すると、パスワードを聞いてきますので自分のログイン時のパスワードを入力してください。その後、/bin/bashと間違えないように入力します(インストール方法によっては他のパスの場合もあります)。
もしうまくいかない場合は、/etc/shellsにbashが登録されていない可能性があります。もしあなたがスーパーユーザーなら、/etc/shellsに/bin/bashを追加してからもう一度行ってみてください。あるいは、bashがマシンにインストールされていない可能性もあります。現在の最新版(2000年6月1日現在)であればftp://ftp.gnu.org/pub/gnu/bash/bash-2.04.tar.gzなどをダウンロードするとよいでしょう。もしSolarisユーザであれば、Freeware for Solaris(http://www.sunfreeware.com)にbashがコンパイルされたものが置いてありますので、ダウンロード可能です。インストールが終了した後、/etc/shellsに登録するのを忘れないで下さい。
多くのlinuxディストリビューションでは/bin/shが/bin/bashに リンクされています。そのため、/bin/bashのファイルを直接別のファイルに置き換えることは
危険を伴います。なぜなら上記で述べたようにマシンのブート時のいたるところでシェルスクリプト(/bin/sh)が使われているからです。 このため、シェルの新しいバージョンをインストールする場合などは、/bin/shや/bin/bashは変更(もしくは上書き)せず、他のディレクトリなどにインストールするとよいでしょう。
さて、chshコマンドが実行できましたら。/etc/passwdの中を見て確認します。grepコマンドをつかってみましょう。login IDが“redhat”の場合は、以下のようになります。
$ grep redhat /etc/passwd redhat:PwKkwL/Chw4RE:101:100:redhat user:/home/redhat:/bin/bash
いちばん最後が/bin/bashになっていれば成功です。次回ログインした時からbashがログインシェルとなっています。もちろん/etc/passwdを直接書き換えてもログインシェルを変更できますが、安全の面からみて、できればやらないほうがよいでしょう。
今後この連載では、bashを使ってシェルスクリプトの使い方を説明していきたいと思います。
Copyright © ITmedia, Inc. All Rights Reserved.