情報処理概論目次

UNIXのシェル

テキスト(LaTeX)版は(I)(II)の2つに分かれています. 基本的な考え方等についてはテキスト版に説明してある.

コンピュータとオペレーティングシステム

コンピュータを構成している機器部品(CPU,メモリ,キーボード,ディスクドライブなど)をハードウエアといい,これを操作制御するための基本ソフトウエアオペレーティングシステム (operating system)という(単にOSともいうことがある). コンピュータという金物(ハードウエア)とそれを制御操作するOSとを区別していることに注意する. たとえば,まったく同じDOS/Vコンピュータであっても,容易に入手できるOSには,次のものがある.

インターネットや先進的なコンピュータ利用の場ではUNIXは欠かすことのできないOSで,最も重要なOSであり,深く勉強するに値する. OSもコンピュータソフトウェアである. コンピュータソフトウェアの中で,OSほど洗練され考え抜かれたプログラムはないとも言われている. 多くのOSの内,OSプログラムのソースコード (source code)が完全公開(有料も含む)されているのはUNIX(とTRON)だけである. UNIXは世界中の学生がこれらのプログラムを学習・研究することを許すことによって優れた科学者・技術者を輩出してきた.

演習:オブジェクト指向とは何かを調べてみよ.

シェル--UNIXのコマンドインタプリタ

UNIXでは,キーボードから(特定の)文字列を入力することによって対応するプログラムを起動する. より正確にいえば,入力されたコマンド 文字列は,直接UNIXの核心部(カーネル:kernel)に渡されるのではなく,シェル(shell)と呼ばれるコマンドを解釈する(インタープリート interpret)プログラムに渡される.

シェルの目的は,入力コマンドを読んで,これを解釈してUNIXカーネルとの仲介をすることである. シェルは

  1. コマンド行を読んで,
  2. その構文を調べて,
  3. 対応するUNIXコマンドや組み込みコマンドを呼び出して実行し(そのとき制御はそのコマンドに渡る),
  4. コマンドが終了すると制御を受け取り,
  5. 処理結果やエラー報告を返す
仕事を行なう. つまり,シェルの役割は がある.

UNIXを使ってコンピュータを操作するためには,まずシェルのユーザーインターフェイス機能を知らなければならない.

UNIXは,他のOSとは異なり,ユーザーインターフェイスに位置するシェルは単なるプログラムであるために,さまざまな改良や機能を加えることが可能である. 換言すれば,シェルの使いやすさがUNIXの使いやすさを左右するという意味でシェルは極めて重要である.

シェルには,標準のsh(Bシェル: Bourne shell),csh(Cシェル)さらに改良したtcshなどがあり,本学ではtcshを使う設定にしている.


補完機能--これは便利

cshtcshには,キーボードからコマンドやファイル名を入力するときにそれを補完(completion)してくれる機能がある. chではファイル名を,tcshではさらにコマンドを補完してくれる.

コマンドまたはファイル名の頭の何文字かを入力してTabキーを押すと 自動的に残りの文字列を補ってくれる(ファイル名補完のためには,ESCキーを押すのが一般的である).

たとえば,現在居るディレクトリ内にファイルreport.texがあり,その内容をcatで表示させたい時には

% cat rep
まで入力してから,Tabキーを押すと,残りの文字列"ort.tex"を補ってくれる.

さらに,頭の文字が同じファイル名report.dvireport.auxなどがあるときには,tabキーを押すと残りの共通する文字列"ort."までを補ってくれる.

演習:ディレクトリpublic_html内のファイルを一覧するためにtcshの補完機能を利用してみよ.

コマンドの位置を知る

シェルがプログラムであれば,UNIXファイルシステムのどこかに格納されているはずである.

一般に実行可能プログラム(executable program)は,テキストファイルではなくバイナリファイルと呼ぶ. バイナリプログラムであるコマンドは,UNIXではbinの付くディレクトリ(BINaryの意)に格納されている.

コマンドがどのディレクトリにあるかを知るためにはwhichコマンドを次の形式で使う.

% which コマンド名
結果は,絶対パス名で表示される. たとえば,コマンドlsは"/bin/ls"が結果として表示される.

whichはコマンドを発見した時点で探索を中止するので,同名のコマンドが未探索領域にあっても表示されない.

演習: シェルがプログラムに過ぎないことは,これがコマンドとして幾種類も用意されていることからもわかる. shcshtcshがどのディレクトリに格納されているかを報告せよ.

ファイル展開文字

UNIXでは,ファイル名として事実上いくらでも長い名前を付けることができる. ファイル名とファイル内容ができるだけ対応している適切なファイル名を付けることは,あらゆるコンピュータ利用において最も基本的で重要な情報処理技法である.

この考えを徹底するとファイル名が長くなって,キーボード入力がわずらわしくなる(このときには,シェルの補完機能を利用する). また,先頭文字が同じファイル名が増える結果となる.

このようなとき,ファイル名を楽に指定したり,同じようなファイル名を持つファイル群を取り出すことができる. これをシェルのファイル名展開またはファイル名置換という. コマンドはファイル名展開をした後に起動されることに注意.

ファイル名展開のパターン
パターン 意味
* 任意の文字列
? 任意の1文字
[文字列] "文字列"中の1文字.[3-5]}なら,3,4,5がマッチ.
~ ユーザーのホームディレクトリの絶対パス
{strA,strB,...} 文字列パターン中でstrA},strB}等をファイル名置換したものをならべたもの

ファイル名展開を利用するためには,表の記号を使って,コマンドに渡すファイル名としてファイルパターンを指定する (ファイル名に,これらの記号を含ませることは可能であるが,"パターン"を指定するときに工夫を要するので,これらの記号をファイル名には使わないこと).

たとえば,

% ls パターン
とすると,指定したファイルパターンにマッチ (match)したファイル群だけが一覧される.

"ls *"は現在居るディレクトリ下のすべてのファイルおよびディレクトリを表示する(単なるlsと同じ). "ls *.tex"は,拡張子として.texが付いたLaTeXファイルだけを一覧する.

また,"plot?.plt"はplotに続いて任意の1文字(または0文字でも可)あり,拡張子.pltの付いたファイルを一覧する. "ls [a-z]*"はファイル名が英小文字で始まるファイルを一覧し,"ls ~/public_html"はどのディレクトリにいようとも自分のホームディレクトリにあるpublic_htmlにあるファイル・ディレクトリを一覧する.

演習: ファイル名展開を使って,ファイル名の末尾に記号『~』が付いたMuleで作成・編集したバックアップファイルを一覧せよ.

同様に,LaTeXのコンパイル時に作成される拡張子.log.aux.tocおよび.dviのついたファイルを一覧せよ.\par ファイル操作コマンドにファイル名拡張を使うと効率的である.

以下の操作は,操作結果をよく理解してからコマンドおよびファイル名展開を利用せよ. ファイル内容を確かめた上で,不要なファイルを削除してみよ. 削除コマンドを使った後は,必ずその結果をlsで確認すること.

たとえば,"rm *.log"で拡張子.logの付いたファイルを削除することができる. さらに,関連するファイル群をまとめてディレクトリ管理するために,(必要ならディレクトリを作成し)目的とするディレクトリにファイル群を移動せよ.


標準入出力

コンピュータは,一言でいってしまえば,データを与えるとそれを処理し結果を吐き出すという出入口を備えた機械である. データを食って"排泄"するという意味では,コンピュータは生物と何ら変わらない. UNIX(など多くのオペレーティングシステム)では,データの出入に関して標準的な装置を設定している. これを標準入出力装置(Standard Unput/Output Device)といい,現在では次の表のように割り当てられている

UNIXの標準入出力装置
出力装置 装置名称
標準入力装置 キーボード
標準出力装置ディスプレイ

I/Oリダイレクション

UNIXのシェルがコマンドの入力や出力を切り替えるI/Oリダイレクション機能を持っている. UNIXでは,データの入力(書込)を標準とは別のファイル(装置)に,または標準とは別のファイル(装置)からデータを出力(書出)することができる.

これを入出力のリダイレクション(redirection)といい,UNIXコマンドに記号『<』または『 >』を使ってリダイレクション先を指定する.

リダイレクション機能を使って,コマンドの実行結果をファイルに出力したり,コマンドにファイルから入力したり,次の処理のために使うことができる. 一般のUNIX利用者のレベルでは,I/Oリダイレクションと後で説明するパイプを組み合わせて目的とする処理を行なうことがUNIX操作の最重要事項である.

演習:以下の説明にあわせて,実際に確かめてみよ.

リダイレクションは記号『>』,『<』を使って標準入出力を切り替える. 使用するコマンドに入出力が伴う場合,実際には次のように使う.

コマンド > ファイル
"コマンド"からの出力先を"ファイル"にリダイレクションする
コマンド < ファイル
"コマンド"への入力を"ファイル"からリダイレクションする
たとえば,現在のワーキングディレクトリ内のファイルおよびディレクトリの一覧結果を標準出力装置へ出力するコマンドlsの結果を,指定したファイルへリダイレクトするには,次のようにする.
% ls > ファイル名
catは標準入力装置から入力された文字列を標準出力装置へ出力するコマンドである. 通常は,
% cat < ファイル名
のように,標準入力装置への入力はリダイレクトされテキストファイルから入力されて,その結果を標準出力装置へ出力する. この場合,入力の切り替えのリダイレクト記号『<』は省略される.

たとえば,現在いるディレクトリのファイル・ディレクトリの一覧結果を,たとえばファイルlistに書き出し,その内容をモニタに表示するには次のようにする.

% ls > list
% cat < list
このとき,『コマンドlsの結果を標準出力(モニタ)からファイルlistに リダイレクションする』,『コマンドcatへの入力を標準入力(キーボード)に代わってファイルからのリダイレクションで行なう』という.

catは,実際にはファイルの並び連接して(concatenate),その結果を標準出力装置に出力することができる(そのようにプログラムされている). つまり,次ぎのようにファイルfile1file2file3をならべてcatに渡すと,それらが連接されて出力される. この例では,その結果をファイルmergeにリダイレクトしている.

% cat file1 file2 file3 > merge
こうして,多数のファイル内容をつなげて1つのファイルにすることが極めて容易である.

演習: 適当なファイルを2つ以上連接して1つのファイルにまとめ,その内容を実際に表示して,連接されていることを確かめよ.

ファイルへの追加リダイレクション

次のように,たとえばディレクトリ/home内のファイル・ディレクトリの一覧結果を既に存在しているファイルにリダイレクションしてみる.

% ls /home > list
% cat < list
すると,ファイルlistに先に書き込まれていた内容は消え去り,新しくリダイレクションされた結果だけがファイル内容となっている(シェルによっては,"上書き"の警告を出してくれる場合がある). リダイレクション先のファイル名は既存のファイル名と重複しないように十分気をつけること. 一方,標準出力へ出力をリダイレクションしてファイルの末尾に追加して書き出す場合には『>>』を使う. たとえば,既に書き込まれたファイルの末尾にlsの結果を追加するには次のようにする.
% ls >> list
% cat < list

Here Document

次の例は,catを使って,エディタを使わないでキーボードから入力された文字列を"ファイル名"で指定されるファイルに書き出す例である. このような方法による直接的にファイルを書き出すことをHere Documentという.

catに入力されるファイル名が省略されていること,および標準出力装置への表示がファイルへリダイレクトされていることに注意する.

% cat > ファイル名
キーボード入力
^d
入力ファイル(装置)が省略されたために,catコマンドへの本来の入力装置である標準入力装置(キーボード)からデータがcatへ入力される. そのために,キーボード入力を待っている状態になる. キーボードから文字列を入力し,最後に入力の終わりを知らせる^d を押すと,その結果catの標準出力への書出)が"ファイル名"で指定されたファイルにリダイレクションされる.
^dはControlキーを押しながら小文字のdキーを同時に押すことを意味する.C-dとも書くことがある.
Here Documentは,次のようにして,標準入力としてendstrが出現するまで入力することによっても行なえる.
<< endstr
.....標準入力
endstr
<<の後に,入力したいデータの中にはない文字列 endstrをかき,"入力の終わり"の印とする. たとえば,次のように使う.
% cat <<EOF > ファイル名
This is a Here Document.
Without Editor, we can make any files!
EOF
すると,指定したファイル名に入力文字列が書き込まれる.

演習: 実際に,Here Documentを作成し,その内容を表示せよ.

提出課題

ホームディレクトリおよび,その中にあるすべてのディレクトリ内のファイルをlsで一覧した結果をディレクトリ名を添えて,次の要領でLaTeX文書にまとめて報告せよ(Mail/News/ディレクトリ内を除く). ただし,先の演習で行なったように,不要なファイル群は削除され,すべてのファイルは適切なディレクトリ内に格納されていることが前提条件である.

ホームディレクトリを含むすべてのディレクトリ内のls -l-lオプション付き:"エル"である)によるファイル一覧結果を適当なファイルにリダイレクションし,ディレクトリ名を添えてその内容を次のようにしてLaTeX文書内に取り込め

  1. LaTeX文書ファイル内で,ファイル内容を取り込みたい位置にカーソルを移動する.
  2. C-x iCtrlキーを押しながらxを押してから,iを押す)でモード行に読み込みたいファイル名を指定すると,カーソル位置に目的のファイル内容が挿入される.
  3. LaTeXの印刷結果がlsの標準出力結果と同じようであるために,読み込んだファイル内容の前後に\begin{verbatim}\end{verbatim}で挟んで
    \begin{verbatim}
    リダイレクトしたファイルから読み込んだlsの結果
    (ファイル・ディレクトリ群の一覧)
    \end{verbatim}
    
    のようにせよ. このようにverbatim環境を使うと,フォントはタイプライター体となり,テキストを配置したようにそのままタイプ印刷したように出力される.

情報処理概論目次