最低限 UNIX / Linux [III]

  1. シェル
    [1.1] シェル (Shell) とは
    [1.2] シェルの役割
    [1.3] 代表的なシェルの紹介
    [1.4] シェルの確認と変更
    [1.5] bash の機能
    [1.6] 環境のカスタマイズ (Bash)
    [1.7] その他のシェル
  1. 最低限 vi
    [2.1] vi とは
    [2.2] ファイルオープン/クローズ
    [2.3] vi の基礎 - 状態遷移
    [2.4] vi の基礎 - コマンドモード
    [2.5] vi の基礎 - 挿入モード
    [2.6] 実践編
    A 参考 [vi の応用]
  1. シェルスクリプト
    [3.1] シェルスクリプト入門
    [3.2] シェルスクリプト応用
    A 参考 [特殊記号の復習]
  1. 本日の課題
    課題
    ヒント
    投稿の前に
<< 情報実験第4回トップへ

1. シェル

[1.1] シェル (Shell) とは

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

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

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

例えると直接は言葉の通じない相手(kernel と呼ばれるプログラム)と あなたがコミュニケーションをする際に必要となる こまごまとした準備や通訳などをこなしてくれる秘書or通訳??さんの様な役割を はたしてくれるのが "シェル" (shell)と呼ばれるプログラムです. 普段意識しないと存在に気づかないのですが, 実は非常に有能なプログラムです. 彼(or 彼女?)の上手な使い方を覚えることは UNIX の能力を最大限活用するのに不可欠です.

シェルは Kterm 等のターミナル上で実行しますので、ターミナルを立ち上げないと シェルというカーネルに対する窓口が使えません。 最近の Window manager は賢くなって X 上に色々なアイコンを表示してくれ、 それをクリックすると netscape 等が起動するようになっています。 しかし正しい作法はターミナルを立ち上げ、そこのシェルを通じて様々な プログラムを起動することです。


[1.2] シェルの役割

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

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

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

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


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

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

$ set
$ finger username

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

(注意) 以下のこのコマンドは実習では行わなくて構いません.
$ chsh (または ypchsh

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


[1.5] bash の機能

ここでは, bash の コマンドラインにおける入出力やジョブ制御など, 基礎的な事項についてまとめています.

[1.5.1] リダイレクション

cat, echo, date などのコマンドを入力すると, 結果が表示されます. これらの結果をファイルに書き込みたい場合はリダイレクションを 使います.

$ echo "hello world" > hello.txt

$ cat hello.txt
hello world

$ cat hello.txt > world.txt
$ cat world.txt
hello world

$ date >> world.txt
$ cat world.txt
hello world
Sat Oct 26 00:41:30 JST 2002
< 「>」が echo "hello world"
  の結果を hello.txt に書き込む.
< hello.txt の中身を表示


< 次にhello.txtの中身をworld.txtにリダイレクト
< world.txt の中身を表示


< 「>>」を使うと上書きされずに追加される.
< world.txt の中身を表示


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

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

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

この機能は便利で, * (アスタリスク)は良く使います.

$ mkdir work/
$ cp *.txt work/

$ rm *.txt

< カレントディレクトリ内で末尾が .txt という
  ファイルを work 以下に移動させる. 
< カレントディレクトリ内で末尾が .txt という
  ファイルを消去する. 

但しいくら便利だからといって以下のコマンドを実行してはいけません. 筆者はこのせいで卒論の原稿を半分消してしまったことがあります.

$ rm * 
絶対に禁止!!!

[1.5.3] パイプ

上記のリダイレクションでは表示される結果をファイルに書き出しました. これに対し, パイプ「|」を使用すると結果をコマンドに送ることができます.

$ ls -la /dev
           :

$ ls -la /dev | less
           :

$ ls -la /dev | grep "pty" | less
< /dev 以下のファイルを表示
< 大量の情報が表示される

< パイプ「|」で結果をコマンド「less」に送る
< 結果を less で見ることができる.

< パイプを連続で使うことで複数のコマンドを連結して
    使うこともできる. (「grep」コマンドで "pty" とい
    う文字列を含む行のみを抽出し、結果を less で見る)

[1.5.5] ジョブ制御

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

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

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

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

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

$ kterm &
$ xclock
^Z
[2]+  Stopped          xclock
< ( kterm を新たに起動すると起動したターミナルに制御が移りますが, 
    マウス等を使って初めのターミナルに戻って作業を続けて下さい. ) 
< 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

フォアグラウンドジョブは, Ctrl-c(コントロール・キーを押しながら c キーを押す)として、 終了させることもできます. フォアグラウンドジョブが正常終了できなくなった場合等に有効です.

^C
$
< Ctrl-c を押します
> プロンプトが表示され入力可能となります. kterm は終了します. 

バックグラウンドジョブを終了させるには, kill コマンドを用います.

$ kill %2
[2]+  終了しました       xclock
<ジョブ番号[2]の xclock に終了シグナルを送る. 

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

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

$ ls /[Tab]
bin          etc          lib          root         var
boot         floppy       lost+found   sbin         vmlinuz
cdrom        home         mnt          opt          tmp
vmlinuz.old  dev          initrd       proc         usr          
$ ls /h[Tab]
$ ls /home/

> 「/」以下のファイル
    の候補が表示されます



> 「/home/」が補完されます

Tab 以外の補完機能
キー操作 意味
Esc ? 補完候補のリストを一覧する。
Esc / ファイル名として補完を行なう。
Esc ! コマンドとして補完を行なう。
Esc Tab 以前に実行したコマンドの補完を試みる。

[1.5.7] ヒストリ機能

bash には便利なヒストリ機能が存在します. この機能によって以前に入力したコマンドを簡単に呼び出すことができます.

$ cat .bashrc
$ 
$ cat .bashrc


< 何らかのコマンドを入力してみる.
< シェルのプロンプト
< 「↑」, または Ctrl-p
  (コントロール・キーを押しながら p キーを押す)
  と以前に入力したコマンドを呼び出すことができる.

history コマンドを入力すると今までに入力したコマンドが表示されます. これらの情報は ~/.bash_history に格納されています.

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

シェルで実行できるコマンドの種類には, 「外部コマンド」,「組み込みコマ ンド」, 「エイリアスで定義されたコマンド」等があります. 「外部コマン ド」は /bin/, /usr/bin/ 以下のディレクトリに個別に格納されており (例: ls, kterm) , 「組み込みコマンド」はシェルのプログラムに直接組み込まれ ています.「組み込みコマンド」には以下のようなものがあります。

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

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

コマンドに関するマニュアルは, man というコマンドを用いることで得られます.

[1.6] 環境のカスタマイズ (Bash の場合)

[1.6.1] シェル変数

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

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

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

$ PS1="\u% "       
inex%
inex% PS1="\d$ "
Fri Nov 26$
Fri Nov 26$ PS1="\s-\v\$ "
bash-2.01$ 
bash-2.01$ PS1="\u@\h:\w\$ "
inex@joho:~$ 

プロンプト表示のコマンド
コマンド 意味
\d 日付
\H ホスト名
\h 最初の"."までのホスト名
\n 改行
\s シェルの名前
\u 現在のユーザ名
\v bash のバージョン
\w 現在の作業ディレクトリ
\! 現在のコマンドのヒストリ番号

[1.6.2] 環境変数

シェル変数はシェルの中だけで使われる変数ですが、 こちらは、アプリケーションやコマンドなどの動作を統一的に制御するために 、ユーザーが設定する変数です。

有名な環境変数
環境変数名 意味
USER ユーザ名
HOST ホスト名
LANG 言語環境。日本語ならば ja_JP.ujis、英語ならば C
PATH コマンドサーチパス
HOME ホームディレクトリ

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

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

$ export LC_ALL=latin1
$ man man
$ export LC_ALL=ja_JP.ujis
$ man man

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

次に以下のコマンドを実行して下さい。

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:
$ date
Fri Nov  1 14:18:18 JST 2002

$ export PATH=""
$ date
bash: date: command not found
$ /bin/date
Fri Nov  1 14:18:18 JST 2002

$ export PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:"
$ date
Fri Nov  1 14:18:18 JST 2002

< 環境変数 PATH を表示させます

> date コマンドで
現在の時刻が表示されます.

< 環境変数 PATH を空にします.

> date コマンドは無いと言われました. 
< date コマンドの絶対パスを指定しました.
> 現在の時刻が表示されます.
  
< 環境変数 PATH の設定を元に戻します.
> date コマンドで
現在の時刻が表示されます.


すると最初は存在していたはずの date コマンドが存在しないと言われるでしょう. コマンドもファイルですから本来は絶対パスで書かねばならないのですが, PATH 環境変数にコマンドの置かれているディレクトリを指定しておくと コマンド名そのもので実行できます.

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

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

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

お薦め: rm -irm と変更

$ echo "hello world" > hello.txt
$ rm hello.txt

$ echo "hello world" > hello.txt
$ alias rm='rm -i'
$ rm hello.txt
< hello.txt ファイルを作成
< hello.txt ファイルを削除

< hello.txt ファイルを作成
< rm -i を rm として登録
< hello.txt ファイルを削除

[1.6.4] 起動ファイル, 環境定義ファイル

個人で環境変数やシェル変数を変更する場合, ホームディレクトリ以下に 存在する .bashrc, .bash_profile を編集します. 例えば自分の作成したプログラムやスクリプトの置場にも PATH を通す場合, .bashrc や .bash_profile を編集する必要があるでしょう. この 2 つのファイルの役割は以下のようになっています.

.bashrc と .bash_profile の役割
ファイル名 役割
.bash_profile ログインシェルの設定.
.bashrc ログインシェル以外のシェルの設定

ログインシェルとはユーザがログインした時直後に現れるシェルのことです (情報実験機の Kondara MNU/Linux はログインした直後に X の画面が立ち上がる ので, どれがログインシェルかわからないと思います....). ターミナル(kterm 等)を起動すると一緒にシェルも起動されますが, そのシェルは .bashrc を読み込んでいます. 2 つ設定ファイルがあって紛らわしいかもしれませんが, 混同しないように しましょう.

.bash_profile,.bashrc 共に「シェルスクリプト」になっています (シェルスクリプトに関しては後述します. ). それらのファイルの中身はコマンドが羅列してあると考えて下さい. ですから ls --color を ls にエイリアスし, LANG 環境変数を日本語に したかったらファイル内に以下の 2 行だけ書いておけば良いです.

$ alias ls='ls --color'
$ export LANG=ja_JP.ujis

[1.7] その他のシェル

ここでは bash について説明しましたが, 時間があれば他のシェルも試しに 使ってみましょう.

$ ash
$ 
$ ^[[A^[[A^[[D^[[D

$ exit
< これが最も初期の「sh」である.
< ashのプロンプト (bash とは違うモノが表示されるはず)
< ヒストリ機能は使えず, カーソルキー(矢印キー)
  を押してもこんな文字が表示されるだけ.
< 元のシェルに戻る.

他にも情報実験機ではcsh, tcsh を使うことができます.



<< 戻る (実習の前準備)      次へ >> (最低限 vi)

最終更新日: 2004/10/22(山田 由貴子) Copyright © 2004 inex