最低限 UNIX / Linux [I]

  1. ルートと一般利用者
  2. アカウントの作成
  3. パスワードセキュリティー
  4. ファイルとディレクトリ
  5. UNIX の代表的なコマンド
  6. シェルとシェルスクリプト
  7. 最低限 vi

5. UNIX の代表的なコマンド

UNIX のコマンドも、やはり実体はファイルです。 これらは /bin、/usr/bin、/sbin などにあります。 コマンドを実行するには、そのコマンドのファイル名を入力し、 Enter キーを押します。 ほとんどのコマンドは、そのマニュアルを man コマンドで参照できます。 幾つかのコマンドは、オプションや引数を指定することができます。 オプションは大抵 '-' 記号で始めます。


[5.1] man


[5.2] ls


[5.3] cat


[5.4] cd


[5.5] mkdir


[5.6] rm


[5.7] rmdir


[5.8] more


[5.9] less


[5.10] passwd


[5.11] pwd


[5.12] adduser


[5.13] vipw


[5.14] chmod


[5.15] chown




6. シェルとシェルスクリプト

[6.1] シェル(shell)

シェルとは、ユーザーから入力されたコマンドを解釈し、 プログラムを起動するアプリケーションです。 他の OS で機能的に似た役割を持つものとして、 Windows95/98では Explorer、Macintosh(MAC)では finder があります。 しかし、イメージとしては Windows95/98 の DOS プロンプトや、 WindowsNT のコマンドプロンプトの方が近いでしょう。

通常、シェルは login シェルとして、 各ユーザがログインする度に起動され、ログアウトの際に終了します。 ログインすると、端末の上に、例えば "samson$" と表示されますが、 これがシェルが発している「プロンプト」(ユーザへコマンドの入力を促す記号)です。

UNIX の内部構造をみると、核となる部分はカーネル(Kernel)と呼ばれ、 マルチタスクやファイルシステム、仮想記憶、入出力など、 OS にとって重要な機能を司っています。 ユーザーはカーネルを直接操るのではなく、 あらかじめ用意されたインターフェイス(窓口)を通して、 カーネルに対してコマンドの実行を要求します。 このインターフェイスの部分がシェルであり、 つまりシェルはユーザとカーネルの仲立ちをしているプログラムであると言えるでしょう。


[6.2] シェルの役割

シェルには大きく分けて3つの役割があります。

  1. ユーザーインターフェース(コマンド・インタプリタとしてのシェル)
    • プロンプトの表示
    • コマンドの読み込み
    • コマンドの前処理(解釈)
    • コマンドの実行
  2. 環境設定の道具
  3. プログラミング言語(スクリプトを解釈する論理的な制御機能としてのシェル)

[6.3] 代表的なシェルの紹介

主要なシェルには以下のようなものがあります。


[6.4] 利用するシェルの確認と変更

[6.4.1] 現在、自分がどのシェルを使っているか調べる方法

$ set
$ finger username
$ grep '^username:' /etc/passwd

[6.4.2] 自分のログインシェルの変更方法

$ chsh (または ypchsh

次にログインするときに、変更したシェルが起動されます。 (管理者の設定により無理な場合があります)


[6.5] bash の機能

[6.5.1] シェルの組み込みコマンド

多くのシェルは、ls や kterm などの独立したコマンドを実行するだけでなく、 あらかじめシェルのプログラムに組み込まれているコマンドを幾つか持っています。 このようなコマンドは"組み込みコマンド"と呼ばれ、以下のようなものがあります。

echo, set, unset, alias, history, cd, ...

help コマンドを利用すると、これら組み込みコマンドの、簡単な説明を得られます。

[6.5.2] シェル変数

bashは、シェル自身の動作を定義する変数を持っています。 この、シェルが内部で保持している変数を、"シェル変数"と言います。 シェルスクリプトや、コマンドの入力の際に、 値を一時的に格納して後で再利用できるようにするための変数でもあります。 後述する環境変数と違い、シェル以外のプログラムからは参照できません。

基本的に、変数名をつける際は、好きなようにつけて構わないのですが、すでに定義され ている変数とは重ならないように指定した方が無難です。

例として、プロンプトの表示を変えてみましょう。 プロンプトの表示は、シェル変数"PS1"を用いて設定することが出来ます。

$ PS1="\u% "       
inex%
inex% PS1="\d$ "
Fri Nov 26$
Fri Nov 26$ PS1="\s-\v\$ "
bash-2.01$ 

[6.5.3] 環境変数

シェル変数はシェルの中だけで使われる変数ですが、 こちらは、アプリケーションやコマンドなどの動作を統一的に制御するために 、ユーザーが設定する変数です。 代表的なものとしては、USER, HOST, LANG, DISPLAY, PATH, HOME などがあります。

シェル変数・環境変数には、 あらかじめ使い方が決められたものがあり、 変更には注意が必要です。

例として、以下の4つのコマンドを順番に入力してみてください。

$ export LANG=C
$ man man
$ export LANG=ja_JP.ujis
$ man man

これを実際に試してみると、 一度目の man man と二度目の man man で出力される結果が違うのが、 確認できると思います。 環境変数とはこのように、 あらかじめ設定していた文字列によってプログラムの動作を規定する為のものです。 (プログラム側で対応していない場合は効果ありません)

[6.5.4] メタキャラクタ(ワイルドカード)

コマンド入力の際に、 複数のファイル名を「ある規則にしたがってまとめて表す」という試みのために用いられる文字のことを、 "メタキャラクタ"(ワイルドカード)と言います。 メタキャラクタを用いると、タイプする文字数を減らすことができるので、 効率的に入力が行えます。

代表的なメタキャラクタ
メタキャラクタ 意味
* 任意の文字列を表す。
? 任意の1文字を表す。?? は任意の2文字になる。
[ ] [ ] 内に含まれる文字にマッチする。 例えば [a-c]* は abc のいすれかで始まる任意の文字列を表す。
{ } { }内に含まれる文字列にマッチする。 例えば test.{pl,gif,f} は、test.pl test.gif test.f と入力したことになる。

[6.5.5] エイリアス(別名)機能

あるコマンドに対して、別名をつけたいときに用います。

alias 別名=コマンド名
alias 別名='オプション付きのコマンド名'

お薦め: rm -irm と変更

[6.5.6] ジョブ制御

ジョブ(Job)とは、ユーザがコンピュータに行なわせる仕事の単位です。

似た意味を持つ言葉に、タスクとプロセスがありますが、 この2つは共にマルチプログラミングの目的で、 コンピュータがCPU(中央演算処理装置)に行わせる仕事の単位です。 ジョブは、複数のジョブステップから構成されることがありますから、 ジョブとタスクは一致するとは限りません。

bash には、1つのシェルで複数のジョブを切替えながら、 並行して作業を行う機能があります。これをジョブ制御と呼びます。

上記2種のジョブを制御するために、 bash には fg, bg, jobs コマンド、そして & が用意されています。

はじめフォアグランドジョブとして起動されたコマンドを、 バックグランドジョブに変更するには、 (フォアグランドジョブが実行されているために)プロンプトが表示されていない状態の端末で、 Ctrl-z(コントロール・キーを押しながら z キーを押す)として、 ジョブを中断させます。

$ kterm &
$ xclock
^Z
[2]+  Stopped          xclock


< Ctrl-z を押します
> ジョブ番号[2]の xclock が停止しました

次に jobs と打ち込み、現在このシェルから実行中のジョブ一覧を表示させます。

$ jobs
[1]-  Running          kterm &
[2]+  Stopped          xclock

> ジョブ番号[1]の kterm が実行中です
> ジョブ番号[2]の xclock が停止中です

xclock より前に kterm が実行されていたので、上のような表示になります。 [ ]の中の数字はジョブの番号を表します。 +は "current job"、- は"previous job"と呼ばれ、 ジョブの切替え対象となる順番を表しています。

bg コマンドを用いると、 フォアグランドジョブをバックグランドジョブに切り替えることが出来ます。 (bg の後に % ジョブ番号と入力)

$ bg %2
[1]-  Running          kterm &
[2]+  Running          xclock &

> ジョブ番号[1]の kterm が実行中です
> ジョブ番号[2]の xclock が実行中です

逆に、バックグランドジョブをフォアグランドジョブに切り替えるには、 fg コマンドを用います。(ジョブ番号の指定の仕方は、bg コマンドと同様)

$ fg %1
kterm

[6.5.7] ファイル、コマンド名の補完機能

bash には、途中まで打ち込まれた内容を元に、 ファイルやコマンドを補完する機能が備わっています。 具体的には、目的の文字列を何文字か入力し、Tab キーを押します。 複数候補が存在する場合は、Tab キーを2回押すことで、 その一覧を表示させることが出来ます。 この機能は他にも、シェル変数、ユーザー名、ホスト名なども補完してくれます。


[6.6] シェルスクリプト

これまで見てきたように、シェルはユーザとコンピュータの橋渡しをして、 ユーザがコマンドを端末から打ち込む毎に、それを解釈し実行します。 一方、[6.2]節で触れたように、 「プログラムが可能である」という、もう一つの面もあります。 この、プログラムとして手続きを書き込んだファイルを 「スクリプト・ファイル」と言います。 スクリプト(script)とは劇の「台本」のことであり、 台本を事前に決めていてそれに沿って行わせるためにこの名前があります。

シェル・プログラミングは通例、B シェルを使って行います*。 具体的にどのようなものか、簡単な例を見てみましょう。

次のような一連の仕事を行うコマンドを作ることを考えます。 (カレントディレクトリは /home/inex/script)

それぞれの働きをするコマンドは
です(Hey! と言われて励まされるかどうかは議論の対象としない)。

従って、次のようなファイルを書こう。

[スクリプトファイル:sample]
#! /bin/sh
date
pwd
echo 'Hey!'
ここで、
$ sh sample
とすると、次のように出力される。
$ sh sample
1990年9月27日(木) 14:40
/home/inex/script
Hey!

この場合、B シェル(sh)をわざわざ起動して、 その引数としてファイル名を指定し、 そのファイルを B シェルが解釈して実行しています。

いちいちこのようなことをするのは非能率でもあるので、

$ chmod 744 sample
もしくは
$ chmod u+x sample
とすると、スクリプトのファイル名を入力するだけで実行することができます。
$ sample

この場合、自動的に(自分が使っている login シェル)が、 スクリプトファイルを B シェルに解釈させ実行させています。


[6.7] より有用なシェルスクリプトを作るにあたって

より有用なシェルスクリプトを作るにあたって、 参考にすると良いサイトや文献を紹介しておきます。




>> 次ページへ

最終更新日: 2000/10/04(河野仁之) Copyright © 2000 inex