UNIX/Linux入門

出典: フリー教科書『ウィキブックス(Wikibooks)』
Linux から転送)
移動: 案内検索

情報技術 > UNIX/Linux入門

大学の学習> UNIX/Linux入門


Wikipedia
ウィキペディアLinuxの記事があります。
Wikipedia
ウィキペディアUNIXの記事があります。


UNIXとは[編集]

UNIXの起源はアメリカAT&T社ベル研究所が開発したOSである。後にカリフォルニア大学バークレー校で学術目的に実装され、ベル研究所のUNIXとカリフォルニア大学バークレー校のUNIX (BSD) 両者が現在広く用いられているUNIXの源流をなしている。

マルチユーザ・マルチタスク機能を発表当初から持っており、ネットワークを介して異なる端末から更新作業などを行える環境をいち早く作り上げた。しかも、マルチタスク機能で、同時にログインして同時に作業することもでき、業務の効率を大幅に改善した。

UNIXの種類[編集]

以下現在主に使用されているUNIX系OSを挙げる

  • BSD系
    • FreeBSD
    • NetBSD
    • OpenBSD
    • DragonflyBSD
    • Mac OS X
  • Solaris(SunOS)
  • HP-UX
  • AIX
  • Linux(以下を参照)

詳細はウィキペディアUNIXの記事を参照

UNIXを扱う上での基礎知識[編集]

操作インターフェース[編集]

基本的には、CUIで操作を行う。CUIとは、コマンドベースのインターフェイスのことで、一定の書式に則った文字列(これをコマンドという)を入力することでコンピュータを操作する体系である。近年、ウィンドウシステムの発達もあって、特にクライアント分野では起動から終了までGUI(CUIに対して、視覚的に操作できる体系)で操作を完結できる環境が整いつつあるが、簡素かつ強力なコマンドラインベースの操作環境は根強く支持されている。GUIを採用しているシステムでも、GUI環境中でコマンドを実行するためのアプリケーション(ターミナルエミューレータと呼ばれる)を利用するのが一般的である。

ファイルシステム[編集]

UNIXでは、ファイルをディレクトリで管理する。ディレクトリはWindowsのフォルダに対応するものであり、複数のファイルを収めることができる。さらに、ディレクトリ内に別のディレクトリがあっても良いので、ディレクトリ群は木構造になる。この構造の頂点となる最上位のディレクトリがただひとつある。これをルートディレクトリと呼び、/と書く。

ディレクトリ構造上の位置をパス (path)と呼ぶ。パスを表記する際は、ディレクトリを上位から順にスラッシュで区切って並べる。例えば

/export/home/user01/main.txt

というパスは、「ルートディレクトリの中にあるexportディレクトリの中にあるhomeディレクトリの中にあるuser01ディレクトリの中にあるmain.txtというファイル」を意味している。

初期状態では /etc ディレクトリなど必須のディレクトリ・ファイルは既に構成されているが、自分でディレクトリやファイルを新たに作ったりすることもできる。

また、処理を行うときは「自分がいる場所」すなわちカレントディレクトリでの処理が基本となるので、CUIではカレントディレクトリを把握しているか、明示的に確認する必要がある。

コマンド[編集]

コマンドとは、コンピュータ上で処理を行うための、特定の書式に則った一連の文字列である。コマンドを入力し、実行する(通常はEnterキーを押す)ことで、そのコマンドに応じた処理が実行される。

例:

$ date
Sun Feb 12 22:11:48 JST 2006
コマンドの例における$は、コマンドが入力できる状態であることを示すために表示された文字で、「プロンプト」と呼ばれる。プロンプトは場合によって異なるがここでは$を用いている。

この例では、'date'というコマンドを実行している。これにより、コンピュータは'date'という指示を受け、その結果'Sun Feb 12 22:11:48 JST 2006'を返す。結果は、この場合画面に表示されているが、正常に処理が行われた場合に何も表示しないコマンドも多い。

コマンド名に続けて文字列をスペースで区切って記述することで、コマンドに付加的な指示を渡すことができる。このような付加的な文字列を引数と呼ぶ。引数がどのように解釈されるかはコマンドによって異なるが、よくある使いかたとして、コマンドの挙動を変更するためのオプションとして使うというものがある。オプションは、通常'-'に続けた一字のアルファベットか、'--'に続けた意味のある語句によって指定される。

例:

$ date -u
Sun Feb 12 13:11:48 UTC 2006

この例では、'date'というコマンドに'-u’というオプションを付けている。これによりdateコマンドの動作は変更されている。この場合は、dateコマンドの仕様に従い、ローカルマシンの時刻からUTC(協定世界時)へと表示される時刻が切り替えられている。

また、コマンドには、引数として操作対象を受け取るものがある。

例:

$ rm test.txt

この例では、'rm'というコマンドに'test.txt'というファイルを指示している。これにより、'rm'というコマンドを通じて、'test.txt'というファイルを操作する。'rm'というコマンドはファイルを消去するので、この場合はtest.txtが消去される。

シェル[編集]

シェルとは、コンピュータに対して指示を出す際に利用される対話プログラムである。コンピュータにコマンドを入力するとき、実際にはシェルに対して入力している。シェルは入力されたコマンドを解釈し、実行する。シェルは複数開発されており、どのシェルを適用しているかによって、コマンドの表現方法が違ったり、同じ意味でもコマンド自体が違ったりする場合もある。

Bシェル、w:kshw:bashw:zshw:cshw:tcshなどがある。Linuxの各ディストリビューションでは、bashをデフォルトのシェルに指定していることが多い。

標準入力、標準出力、標準エラー出力[編集]

コマンドが実行されるとき、コマンドには必ず入出力のための三つの経路、標準入力、標準出力、標準エラー出力が割り当てられる。コマンドは必要に応じてこれらの経路から入力を受け取ったり、出力を書き出したりする。この三つの経路を総称して標準入出力という。

標準入力 
標準入力はコマンドへの情報の入力源である。標準入力を利用しないコマンドもある。通常は、利用しているコンソールからのキーボード入力を標準入力とする。
標準出力 
標準出力とは、コマンドが出力した結果を返すところである。通常は、利用しているコンソールが出力先となる。
標準エラー出力 
標準エラー出力とは、プログラム上エラーとして指示された出力で、通常は利用しているコンソールが出力先となる。

例えば、上記のdateの例で、dateコマンドの出力内容が画面に表示されたが、実はこの時の出力は標準出力に送られている。上記では標準出力の行き先が画面だったため、結果として画面に表示された。

標準入出力の行き先は必要に応じて変更することができる。

例:

$ date > date.txt

>以降は標準出力の行き先をdate.txtというファイルに切り替える指示である。このようにすると、dateコマンドの結果は画面に表示される代わりにdate.txtというファイルに出力されるので、日時を記録したdate.txtというファイルができることになる。このように標準入出力の行き先を変更することをリダイレクトと呼ぶ。なお、「> date.txt」の部分はシェルへの指示であって、コマンドに渡される引数ではないことに注意してほしい。

標準入力を使うコマンドの例も見てみよう。wcは、標準入力から受け取ったテキストの行数・語数・バイト数を標準出力に書き出すコマンドである。

例:

$ wc
This is an example to
show how to use the extremely
useful UNIX command.
      3      14      73

この例ではwcの標準入力はキーボードなので、コマンドを実行するとコンピュータはキーボードからの入力を待つ。そこでテキストをタイプし(この例では3行のテキストを入力した)、入力を終える(これには通常Ctrl-dを押せば良い)と、次の行にwcコマンドの出力が表示される。 Ctrl-dとはCtrlキーを押しながらdキーを押すことである。

標準入力も標準出力と同様にリダイレクトすることができる。例えば、test.txtというテキストファイルの行数を数えるには次のようなコマンドを使えば良い。

$ wc < test.txt
  7  23 235

さらに、あるコマンドの標準出力を別のコマンドの標準入力につなげることもできる。これはパイプと呼ばれる。

例:

$ date | wc
      1       6      43

この例では、パイプを使ってdateコマンドの出力の行数・単語数・バイト数を数えている。

パイプやリダイレクトを使うと、限られたコマンドで自在に多様な操作を行うことができる。

環境変数[編集]

環境変数とはプログラムやアプリケーションが参照する情報を保持する変数のことであり、UNIXではシェルによって管理されている。

例えば、

  • ホームディレクトリ(ログインした直後のカレントディレクトリ)はどこか?
  • 使用言語は何か?
  • ログイン名は何か?

といった情報に該当する環境変数を変えることで情報を書き換えることができる。ただし、適用しているシェルによって設定方法は異なる。

例えばbashを使用していて使用言語 (LANG) を日本語 (ja) としたい場合は

$ export LANG=ja

といった具合である。

通常、環境変数は、大文字で指定される。環境変数を設定、取り消しするコマンドはシェルによって異なる。確認するには、echoコマンドを使う。

例:

$ echo $LANG
ja_JP.UTF-8

といった風になる。

ユーザー[編集]

UNIXは、マルチユーザーシステムであり、ひとつの計算機を複数のユーザーで共有して利用することが前提である。計算機には、そのシステムを利用する権限のあるユーザそれぞれについてユーザー名パスワードが登録されている。通常、計算機を利用する際は、はじめに自分のユーザー名とパスワードを入力しなければならない。これを、計算機にログインする、という。ログインには、計算機に対し、あるユーザーが利用を開始したということを表明する働きがある。同様に、利用を終了することを表明する手続きは、ログアウトと呼ばれる。自分が今どのユーザーとしてログインしているかを知るには、whoamiというコマンドを使えば良い。

それぞれのユーザーは、私用のためのディレクトリを一個割り当てられる。これはホームディレクトリとよばれ、Linuxの場合は通常/home/<ユーザー名>である。ホームディレクトリには、個人に属するデータの他、アプリケーションの個人用設定ファイルなどを置くことができる。これらのファイルは、所有権が自分に属するため、後述するパーミッションによって、他のユーザーが勝手に変更を加えることができなくなっている。

グループ[編集]

特定の複数のユーザーにのみなんらかの権限を与えたいときにはグループが用いられる。たとえば、あるファイルをグループ所有にして、そのグループの一員にのみ閲覧を許す、といったことができる。一人のユーザーはいくつのグループに参加していても良い。

rootとは[編集]

Unixシステムには管理者の役割をするユーザーがあり、慣習的にrootという名前である。rootは原則的にすべてのデバイスやファイルに対する操作が可能な特権をもっていて、Windowsなどでの Administratorにあたる。rootでの誤操作はシステム破壊に直結するため、自分がシステムの管理者であっても、別に一般ユーザーを作成し、root権限が必要な場合を除いてそのユーザーで作業するのが一般的である。

パーミッション[編集]

ファイルやディレクトリについてのアクセスの権限をパーミッションという。パーミッションを設定することで、例えばファイルを特定のユーザーにしか閲覧できなくしたり、あらゆるユーザーが閲覧できるようにしたりすることができる。

全てのファイルには所有者と所有グループが決まっており、これに従ってアクセス権限が分けられる。すなわち、所有者、所有グループの一員、その他のユーザー、という三区分に対して独立に権限を設定することができる。設定可能な権限は以下の三つである。

読み取り(r) 
ファイルなら閲覧、ディレクトリなら内容の表示ができる。
書き込み(w) 
ファイルなら書き換え、ディレクトリなら内容操作ができる。
実行(x) 
ファイルならプログラムとして実行、ディレクトリならそこに移動できる。

ファイルの消去に必要な権限は、そのファイルへの書き込み権限ではなく、そのファイルの置かれているディレクトリへの書き込み権限であることに注意してほしい。

ファイルのパーミッションは、lsコマンドに'-l'というオプションを付加することで確認できる。この場合、パーミッションは次のような表記で表される。

rwxr-x--x

この記法は、左から三文字ずつ、所有者、所有グループの一員、その他のユーザー、に対応している。アルファベットは対応する権限があることを示し、「-」は対応する権限がないことを示す。この例では、このファイルもしくはディレクトリに対して、「所有者」は「rwx」すなわち「閲覧、書き込み、実行可能」、「所有グループの一員」は「r-x」で「閲覧、実行可能」、「その他」は「--x」で「実行可能」ということになる。

また、三桁の八進数の数値でパーミッションを表すこともある。この場合、三つの桁は、左から所有者、所有グループの一員、その他を表す。個々の数字は三種類の権限の有無を二進法で読んだものである。例えば、r-xは二進数に置き換えると101、八進数にすると5である。

最初の例にあるrwxr-x--xなら、計算すると751である。

よく用いられるコマンド[編集]

ここでは、Unixを扱う上で非常によく用いられるコマンドについてまとめる。これらのコマンドは実際にはシェルの機能ではなく、一つのアプリケーションであることに注意が必要である。しかし、これらのコマンドは通常シェルから起動されることから、これらをシェルのコマンドと呼ぶことが多い。

基本コマンド[編集]

  • man

manは、Unixで標準的に用いられるヘルプファイルである。manはターミナル上で全ての情報を表示することを条件として作られているため、色使いなどがあまり現代的ではない面がある。しかし、表示される情報には有用なものが多いため、たびたび用いることになるだろう。特に個々のコマンドの細かいオプションを記憶することは現実的ではないため、機能だけを覚えておき、オプションはそのつどmanで調べるのが現実的だろう。

このコマンドは、

$ man 読みたいコマンド名

として用いられる。manのファイルはいくつかのディレクトリに分けて保存されており、それらのディレクトリには1から8の番号が付けられている。manは、対応するコマンド名が存在するかどうかを、1から順に調べていき、最初に見付かったものを表示する。そのため、同じ名前のmanが若い番号に存在するときには、後に保存されているmanは読むことができない。このときには、見たいmanの番号を調べ、

$ man 番号 コマンド名

のように書く必要がある。また、

$ man -a コマンド名

のようにコマンドを用いると、コマンド名に対応するmanを全て表示するので、こちらを用いてもよい。

$ man man

manについて説明したmanページを読む。

$ man ls

ls(後述)のmanページを読む。

manがmanページを探すディレクトリは、w:環境変数MANPATHに記憶されている。これは、多くの場合 /usr/share/manなどであり、ここにはシステムで用意されているmanページのほとんどが保存されている。システムに興味がある場合はこれらに目を通すとよい。

  • date

dateは、現在の日付と時刻を返すコマンドである。dateコマンドは、日付を設定する目的でも用いることができる。

$ date

現在の日付と時刻を返す。

$ date 日付

現在の日付を設定する。日付の書式については、manを参照のこと。

dateは、システムのw:ロケールによって、表示を変える。

$ LC_ALL=en date
Thu Jun  1 19:08:03 JST 2006
$ LC_ALL=ja_JP.UTF-8 date
木  6  1 19:08:07 JST 2006

ここでは、ロケールを英語にした場合と日本語にした場合を示している。ロケールについては後述。

  • su

suは、一時的に管理者権限を手に入れたいときに使う。設定ファイルを書き換える時など管理者権限が必要なときに用いられる。

$ su

管理者権限を持ったシェルを起動する。

$ su -

管理者権限を持ったシェルを起動すると同時に、環境変数をrootの変数で置き換える。

テキスト操作[編集]

  • cat

ファイルの内容を表示する。複数のファイルが指定された場合にはそれらのファイルを続けて表示する。

$ cat aaa bbb

aaaとbbbの内容を連続して標準出力に出力する。

  • less

lessはキー入力を受け付けることができ、利用者が見たい部分を表示することができる。

$ less aaa

aaaの内容を表示する。

lessは他のコマンドと比べると大きいファイルで、内容も豊富である。詳細な内容は、manを参照すること。

  • tr

trは、ファイル中の特定の文字列を置き換える働きをする。

$ tr a b <ccc

cccというファイル内のaという文字をbという文字で置き換える。

  • cut

cutはファイル内である列を取り出す。列の内容はオプションによって指定でき、-cオプションでは文字数が指定される。一方、-fオプションでは-dオプションで指定されるデリミタによって分割されるフィールドが使われる。

$ cut -c 5 aaa

aaaというファイル内の5文字目を取り出す。例えば、

aaabbb
cccddd

という内容では、

b
d

が出力される。

$ cut -f 2 -d ' ' aaa

空白によって分けられた文章を分割する。内容が

a b c d
e f g h

なら、

b
f

が出力される。

  • paste

ファイル操作[編集]

  • ls

lsはカレントディレクトリの中身を記述する。作成したファイルやディレクトリが実際にディレクトリ内に存在するかどうかを確かめるために用いることができる。このコマンドは、GUIを用いる場合には存在し得ない。なぜなら、GUIを用いる場合には、ディレクトリに存在するファイルは常にアイコンとして表示されており、コマンドを用いて見る必要はないからである。一方、必要なときにのみ適宜ディレクトリの中身を書き出させることは、コンピュータにとってはアイコンを使うよりもはるかに楽な処理である。そのため、コンピュータの性能に応じて、GUIとCUIを使い分けることが望ましい。実際には、CUIでもGUIでも表示される情報には大差が無いため、コンピュータにとってやさしいCUIを用いる方が望ましいだろう(人間にとっては慣れるまで大変だが ... )。

lsの基本的な使い方は、

$ ls ディレクトリ名

となる。ディレクトリ名を省略したときには、カレントディレクトリが表示される。

lsにはいくつかのオプションがあるが、よく用いるものをまとめる。-lは、ファイルやディレクトリについてより詳細な情報を与える。情報は、パーミッション、ファイルサイズ、作成者、作成された時間、最後に変更された時間などである。実用上は、-lだけではなく、-hもつけるとファイルサイズが人間にとって読みやすい形でかかれるため、使いやすくなる。

-aは、ディレクトリ内にある全てのファイルを表示する。通常のlsでは、最初が.から始まるファイルやディレクトリは表示されない。これは、設定ファイルやアプリケーションが内部的に用いるファイルが毎回表示されると場所塞ぎだからである。これらが存在するかどうかを調べるためには、明示的に-aオプションを用いる必要がある。

-Rオプションは、ディレクトリをw:再帰的に下降してファイルを表示する。再帰的とは、ファイルが存在すればそれを表示し、ディレクトリが存在すればそのディレクトリに移動し、再びls -Rと同じ作業を行うという意味である。結局カレントディレクトリ以下に置かれているファイルが全て表示される。大きなディレクトリ内でこれを実行すると結果を得るのに時間がかかるため、控えた方がよいだろう。しかし、探したいファイルがあるときにはこれを使うのがよいだろう。

$ ls

カレントディレクトリ内のファイルとディレクトリを表示する。

$ ls /bin

/binにあるファイルを表示する。/binには、重要なコマンドが保存されている。ls、後に述べるcp、mkdirなども通常ここに含まれている。一方、manや通常のアプリケーションは/usr/binに含まれることが多い。

$ ls -R /usr/include

/usr/include内に含まれるファイルを再帰的に全て表示する。/usr/include内にはC言語などを用いる際に必要になるヘッダファイルが含まれている。システムに必要なヘッダファイルが存在するかを調べるために、このディレクトリを調べることが多い。


  • cp

cpは、ファイルをコピーするコマンドである。cpの使い方は、

$ cp コピーされるファイル名  コピー先のファイル名

となる。

cpもいくつかのオプションを持つ。-iは、コピー先のファイルが存在するときにそのファイルを上書きするかどうか尋ねるようにするオプションである。このオプションが無いときには、cpはコピー先のファイルを勝手に消去し、その上に指定されたファイルを上書きする。この振舞いはしばしば重大な失敗をひき起こすため、-iオプションはできる限り常に用いるようにした方がよいだろう。システムによっては、w:エイリアスなどの機能を駆使して、これらの振舞いが通常となるように設定している場合もある。

しかし、システムを過信せず、自分で気をつける方が望ましい。-fオプションはこの反対で、-iオプションが付けられていたとしても上書きの前に注意を促さないよう動作させる。これは多くのファイルを上書きする際に、通常の振舞いが-iオプションありであったときには非常に不便であることから用いられる。-Rオプションは、指定されたディレクトリを再帰的にコピーする。この機能はよく用いられるが、似た振舞いを持つコマンドとしてtarがあり、また新しいファイルの多くがtarファイルで供給されることを考えると、それほど使わずに済むかも知れない。

$ cp -i aaa.txt documents/

カレントディレクトリ内にあるaaa.txtというファイルを、documentsディレクトリ内にコピーする。-iオプションがあるため既にdocuments内に同名のファイルがあったときには警告が表示される。

  • mv

mvは、cpと違い指定されたファイルを指定された場所に移動するコマンドである。移動された元のファイルは消去される。mvは次のように用いられる。

$ mv 移動元のファイル名 移動先のファイル名

mvにも-iと-fのオプションがある。これらの動作は、cpの対応物と同じである。mvはファイル名を変更する場合にも用いられる。すなわち、AというファイルをBという名に変更するときは、AをBに移動すると考えmv A Bを使用する。

  • rm

rmは、指定したファイルを消去するコマンドである。GUIの'ゴミ箱'と違い一度消去したファイルは取り戻せないので、注意が必要である。不測の事態を避けるために、作成したファイルはこまめにw:バックアップを行うことが望ましい。バックアップにはtarコマンドなどが多く用いられるが、この使い方は後述する。rmコマンドは

$ rm 消去するファイル名

として用いる。

rmもcpやmvとおなじ-iと-fコマンドを持つ。不測の事態を避けるため、-iは常に用いることを推奨する。rmコマンドは再帰的に消去を行う-Rオプションを持つ(-rオプションも同じ意味である)。大きなディレクトリを消去するときには、このオプションは事実上必須であるが、強い効果を持つ命令なので、使用時には細心の注意が必要である。

rmのよくある失敗例は、.から始まるファイルを全て消去しようとして、

$ rm -R .*

とすることである。.*は、..(親ディレクトリ)も含むため、これは親ディレクトリ以下に含まれるファイルを全て消去する命令になってしまう。そのため、このような命令を行うことは絶対に避けねばならない。このときにも-iオプションをつければ消去を行う前に警告が出るので、危険が少なくなる。

  • mkdir

mkdirは、ディレクトリを作成する命令である。mkdirは、

$ mkdir 作成するディレクトリ名

として用いる。ディレクトリをうまく用いるとファイルがどこにあるかが見つけやすくなるので、適宜作成していきたい。

  • rmdir

rmdirは、ディレクトリを消去する命令である。rmdirは、

$ rmdir 消去するディレクトリ名

とする。rmdirは、指定されたディレクトリが空であるときのみディレクトリを消去する。中にファイルやディレクトリが入っているディレクトリを消去するときには、前述の

$ rm -r ディレクトリ名

を用いることが普通である。

  • pwd

pwdは現在のディレクトリを返す。

$ pwd

現在のディレクトリが返される。

  • touch

touchは、指定されたファイルの更新日時を変更する。指定されたファイルが存在しないとき、touchは、ファイルを作成する。一度に複数のファイルを作成することもできる。

$ touch aaa bbb ccc

aaa,bbb,cccという名の空ファイルを作成する。

  • ln
  • dd
  • cd

正規表現[編集]

w:正規表現はあるルールで指定される文字列の集合のことを指す。正規表現を用いて複数のファイルを指定したり、文書中から当てはまる文字列を検索することができる。正規表現自体はあらゆるOS上で利用される技術だが、特にUnixのシェルには正規表現を用いる技術が多くあるのでここでまとめる。

正規表現は複数の文字列が当てはまる'性質'を示す事ができる。例えば、a,aa,aaa,aaaa,... などの文字列はaが連続的に並ぶという性質を持っている。このような名前のファイルを同時に消去したいときには、aが連続的に並ぶという性質を指定できると便利である。w:egrepw:Perl等の正規表現を扱えるソフトでは、この集合を^a+$と指定することができる。ここでは正規表現について詳しくは触れないので、詳しい情報は、'詳説 正規表現(オライリージャパン)'などを参照して欲しい。

  • grep

grepはある正規表現とファイルを指定して、その正規表現に当てはまる行をファイル中から取り出す。

$ grep aaa f.txt

のように用いる。(文中にaaaという文字列を含む)f.txtの内容が

aaabbbcccddd
eeefffggghhh

なら、

aaabbbcccddd

が出力される。正規表現が^ddd(行がdddで始まる)だったときには、当てはまる行が無いので何も出力されない。ddd$(行がdddで終る)では、

aaabbbcccddd

が出力される。

  • find

findはディレクトリを再帰的に下降し、条件に当てはまるファイルを見付けるコマンドである。findの書式は非常に複雑になるので、詳細についてはここでは触れない。対応するmanなどを参照。

$ find .

条件無しにカレントディレクトリ以下のファイルを表示する。

$ find . -name f.txt

カレントディレクトリ以下のファイルで名前がf.txtのファイルを表示する。nameオプションにはシェルパターンを用いることができる。例えば、

$ find . -name f\*.txt

は、fではじまり.txtで終わるファイル(file.txt, ffff.txt, ...などがあてはまる)を探す。

シェルスクリプト[編集]

上のコマンドの例では、コマンドは全て1つずつ入力され、 それぞれのコマンド実行に対してそれぞれの結果が返ってきた。 このように上記の例ではすべてシェルを対話的に扱ってきたが、 あらかじめシェルに実行させたいコマンドをファイルに書いておき、 これをまとめてシェルに実行させることも可能である。 このコマンドを書いたファイルをシェルスクリプトと呼ぶ。

シェルスクリプトの書き方はシェルの種類によって異なるので、 以下ではLinuxやMac OS Xの標準のシェルであるbash (Bourne Again Shell) を例にとって説明する。

最初のシェルスクリプト[編集]

シェルスクリプトとは言っても、基本的にはコマンドを書き並べたものである。

#!/bin/bash
echo hello
uname

これは、「はじめにhelloと表示し、次にOSの名前を表示する」シェルスクリプトである。 行の中の#以降の部分はシェルに解釈されないコメントである。 1行目のコメントには特殊な意味があるので後述する。

カーネル[編集]

この節は書きかけです。この節を編集してくれる方を心からお待ちしています。

プロセス管理[編集]

Unixでは複数のプロセスを同時に動かせる。ここでは、実際に複数のプロセスを動かす方法を述べる。プロセスは互いに独立で、通常は別のプロセスの動作にかかわり無く動く。そのため、他のプロセスの動作を制御したいときには、w:シグナルを利用する必要がある。シグナルは、他のプロセスに送ることができ、プロセスを中断する等の効果がある。

  • &

&は、コマンドの後につけてそれをバックグラウンドで動かす機能がある。これは複数のプロセスを起動したい時に用いられる。

$ xterm &

X Window Systemの起動中に新たな端末を開くときに用られる。xterm自体も1つのX Window Systemにおけるアプリケーションである。

  • HUP
  • INT

INTは、interrupt(中断)の意味を持つシグナルで、プロセスを中断させる。

  • TERM

TERMは、terminate(終了)の意味を持つシグナルで、プロセスを終了させる。

    • 発展

シグナルに対する応答は、プログラム中で書き換えることができる。次の例では、INTシグナルに対する応答を書き換えている。

#include <signal.h>
#include <stdio.h>
void f(){
        printf("aaa\n");
        fflush(stdout);
}
int main(){
        signal(SIGINT, f);
        while (1);
        return 0;
}
$ ./a.out

別のシェルから、

$ killall -INT a.out

とすると、aaaが表示される。 ここでは分かりやすさのためにsignal()関数を用いたが、実用的なプログラムを作る際にはsignal()関数ではなくsigaction()関数を使うべきである。

  • ps

psは現在実行されているプロセスを表示する。

$ ps

現在自分が実行しているプロセスを表示する。

$ ps ax

自分だけでなく他のユーザーが実行したプロセスも表示する。このオプションは、w:デーモンプロセスを見るためによく用いられる。

  • kill

killは、他のプロセスにシグナルを送るコマンドである。killはプロセスID(pid)を引数としてとるので、シグナルを送りたいプロセスがあるときには、あらかじめpsコマンドなどを用いてpidを手に入れておく必要がある。

$ kill 3456

プロセスID3456に、TERMシグナルを送る。TERMシグナルは送るシグナルを指定しなかった時に使われるシグナルである。

$ kill -INT 3456

プロセスID3456に、INTシグナルを送る。送るシグナルは-(シグナル名)で指定することができる。実際に指定できるシグナルについては、$ man killを参照すること。

    • 注意

bashには、ビルトインコマンドの1つとしてkillがある。このため、killが実行ファイルとして存在したとしても、実際に実行されるのはビルトインコマンドの方である。

$ kill %1

はjobsで表示されるプロセスにシグナルを送る。しかし、

$ /bin/kill %1

は、

kill: illegal process id: %1

を返す。

  • killall

Linuxのkillallは、プロセスIDではなく、プロセスの名称を用いてシグナルを送ることができる。

$ killall a.out

a.outは、(おそらく)Cプログラムの実行ファイルである。自作したプログラムにシグナルを送るときに用いる。

  • jobs

jobsはシェルのbuiltinコマンドで、bashを使っているなら、$ man bash内にjobsのmanも置かれている。jobsは、現在自分が動かしているプロセスを表示する。

$ jobs
  • top

topは、動いているプロセスを指定された順序で並びかえ、一定時間毎に表示する。

$ top

ファイルシステム[編集]

w:ファイルシステムは、コンピュータに蓄えるデータをどのように配置するかを定める。ファイルシステムを扱うには、ディスクにw:パーティションを定める必要がある。パーティションを定めた後には、それぞれのパーティションに対してファイルシステムを導入する。

パーティションとファイルシステムは、通常一度定めたら情報を消すこと無く変更することはできない。これは、ファイルシステムを変更すると情報の蓄え方を変更することになり、以前あったデータの場所に関する情報を利用できなくなるからである。そのため、最初にパーティションとファイルシステムを作成するときには、利用法を考えて慎重に作業を行う必要がある(ただし、そのような作業を行うツールも知られていることには注意が必要である)。

  • fdisk

fdiskは、記録媒体にパーティションを定めるコマンドである。fdiskの動作はOSごとに異なっており、オプションの付け方もばらばらである。ここではLinuxの場合について述べる。

Linuxのfdiskはインタラクティブに実行することができる。詳しくは起動した後mで表示されるヘルプ画面を見てもらいたい。現在選択されているディスクのパーティションを表示するには、pを、新しいパーティションを作るにはnを、fdiskを終了するにはqである。新しいパーティションを作成するとそのパーティションが画面に表示されるようになるが、実際に書き込みを行うまではその変化は実行されていない。書き込みを行うには、wを用いる。

実際に書き込みを行うと、全てのデータが消えるので、単に試すだけのときには注意が必要である。

クライアントLinuxのハードディスクでよく用いられるパーティション構成は

パーティション1 50M程度 ブート可
パーティション2 メモリと同程度
パーティション3 残り全部

である。最初のパーティションは起動に必要なカーネルなどを置くパーティションでブート可能に設定する必要がある。これを行うには、fdiskの画面でaを用いる。

  • mkfs

mkfsは、パーティションにファイルシステムを書き込むコマンドである。

  • 注意

netBSDのマニュアルによると、ファイルシステムを書き込むプログラムは、mkfsからnewfsという名称に変更されたようである。ここでは、取り合えずmkfsのままで話を進める。

mkfsについては書式だけでなく、実際に用いることができるファイルシステムについてもシステムによって大きく異なっている。ここでもLinuxのmkfsを用いる。

Linuxでは、mkfs系のコマンドがいくつか存在し、それらは扱うファイルシステムによって名前が違う。これらについては$ man mkfsのSEE ALSOのセクションで列記されている。Linuxでよく用いられていたファイルシステムに、w:ext2ファイルシステムがあるが、これを作成するときには、

# mke2fs パーティション名

を用いる。 ここではrootのプロンプトを#で表している。

  • du
  • df
  • mount

mountは、記憶媒体中のファイルシステムにアクセスできるようにするコマンドである。mountが扱えるファイルシステムもOSによってばらばらである。ここではLinuxのmountについて述べる。

mountは、マウントするデバイス名とデバイス内のファイルシステムを設置する場所を指定して用いる。設置する場所は空のディレクトリならどこでもよい。mountする際ファイルシステムを指定する必要がある(省略しても自動で判断する場合もある)。ファイルシステムを指定するには、-tオプションを用いる。

# mount -t ext2 /dev/hda3 /mnt

ext2ファイルシステムを持つw:IDE接続のw:ハードディスクの3番目のパーティションを/mntディレクトリにマウントする。

# mount -t vfat /dev/sda1 /mnt

w:Windows形式にフォーマット(ファイルシステムを作成すること)された記憶媒体(フロッピーディスク、USBメモリ)を/mntディレクトリにマウントする。w:VFATは、Windowsで標準的に用いられるファイルシステムである。ただし、ここではw:SCSIデバイスはSCSI接続されているとした。実際にSCSIの機器でなくてもUSBの記憶媒体はSCSIとして扱われるものがあるため、多くの機器が/dev/sd*として扱われる(具体的にはのドライバで扱われるデバイスはSCSIデバイスとして扱われる。driver/usb/storage内のファイルを参照)。

# mount -t nfs 192.168.0.2:/pub /mnt

(おそらく)他のコンピュータ上にある/pubというディレクトリを/mntディレクトリにマウントする。w:NFSは、Linuxで用いられるファイルサーバであり他のコンピュータ上のファイルシステムをマウントするために用いられる。w:NFSに関する説明は後述。

  • umount

umountは、mountしたディレクトリを取り除くためのコマンドである。umountは、

# umount マウントしたディレクトリ名

のように使う。

  • fsck

/etc/fstab, /etc/mtab

デバイスファイル[編集]

デバイスファイルはコンピュータに接続された機器にアクセスするためのファイルである。デバイスファイルは、デバイスへのインターフェースでありデバイスそのものではないため、デバイスファイルを削除しても(通常は)問題がない。例えば、/dev/hda1を削除しても、ハードディスクの中身が消えることはない。

また、デバイスファイルはたいてい/dev以下に置かれるが、それ以外の場所においても同じように扱うことができる。ただし、デバイスファイルはデバイスの識別のためにメジャー番号とマイナー番号を持っているため、それらはデバイス毎に使い分ける必要がある。

デバイスファイルを作成するには、mknodコマンドを用いる。mknodは作成するファイルの名称、メジャー番号、マイナー番号、デバイスの種類を指定して作られる。デバイスの種類とは、b:ブロック型、c:キャラクタ型のどちらかである。

エディタ[編集]

w:エディタはテキストファイルを作成、編集するためのソフトウェアである。Unixの設定ファイルはほとんどがテキストファイルであるため、エディタの重要性は大きい。

vi[編集]

w:viは広く用いられるUnixのテキストエディタである。viはほとんど全てのシステムで用意されているため、基本的な設定ファイルの記述にはこのエディタが用いられることが多い。ただし、動作が他のエディタとは異なっているため、その使用には好みがわかれるエディタでもある。詳しい操作はviを参照。

Xウィンドウシステム[編集]

XウィンドウシステムはUnix上でw:GUIを実現するためによく用いられるプログラムである。

Linuxとは[編集]

Linuxとは、1991年にフィンランドのプログラマ リーナス・トーバルズがヘルシンキ大学在学中にMinixより優れたMinixを作るために立ち上げたプロジェクトで開発しGPLで公開したLinuxカーネルを元にしているOSである。 公開当初は、とても貧弱であったが、すぐにハッカー達の支持を受け利用者を増やしていった。安価で手軽にUNIXと類似の環境を得られることからインターネット・サーバとして頻繁に利用されるようになってきた。

GNUについて[編集]

Linuxに収められているソフトの多くは、GNUGPLLGPLといったライセンスで配布されている。

Linuxの種類 ディストリビューション[編集]

自分で Linux カーネルや、gcc など、基本的なソフトウェアをそろえ、システムを構築するのは労力がかかり、多くの知識が必要となる。そのため、利用者が簡単にLinuxシステムをインストールできるように、ディストリビューションと呼ばれるソフトウェアをまとめてインストーラ等を含めパッケージにしたものが開発されるようになった。

ディストリビューションの分類[編集]

ディストリビューションの系統として主にパッケージ管理システムの違いによって3種に分類されるが、どれにも属さないものもある。

  • Red Hat 系
RPMと呼ばれるパッケージ管理システムを持っている。Red Hat Enterprise Linux、Fedora、VineLinux、TurboLinux など。
  • Slackware 系
Red Hat 系のような固有のパッケージ管理システムは無く、ユーザが自分でソフトウェアや、そのソースファイルを管理する。自由度が高いが、知識が必要。Slackware や Plamo Linux。
  • Debian 系
dpkg という RPM 形式よりも強力なパッケージ管理システムを持っている。Debian GNU/Linux や KNOPPIX、Ubuntu、Linux Mint など。

主なディストリビューション[編集]

よく使用されているディストリビューションを以下に挙げる。

  • Red Hat Enterprise Linux
企業におけるサーバシステムの構築やクライアント利用のためのディストリビューション。
  • Fedora
以前は無料版が公開されていたRed Hatからユーザコミュニティに管理が委託された、Red Hatの後継ディストリビューション。
日本人のユーザグループにより保守・開発されている。現在では数少ないCD1枚に収まるディストリビューション。RPM版のaptを採用しているため、簡単にパッケージの管理を行うことができる。日本語環境向けのカスタマイズが細かいことで定評がある。
  • TurboLinux
日本人に配慮してあるので日本では利用者が多かった。Red Hat Linux や Fedora と比較すると最新のソフトウェアの導入は遅れがちだが、安定した OS として、企業ユーザーにも人気があった。特定の用途向けに作られたパッケージが何種類かある。
ボランティア作成である。独自のパッケージ管理システム deb を採用している。インストールが難しい、と言われていたが、Debian-Installer Project によって改善された。
  • Ubuntu
Debianから派生したディストリビューションで、コミュニティにより開発されている。デスクトップでの使用をメインにしており、現在最も人気のディストリビューション。
  • SUSE Linux
欧米で人気が高く、歴史が古い。先進的ではあるが安定的でないカーネルを搭載するのを避け、少し枯れてはいるが安定性の高いソフトウェアを採用している。また、Xgl、AppArmor等の開発でも知られる(一部SUSEより引用)。
BSD の ports に似た独自のパッケージ管理システム portage を採用し、さまざまなシステムを思った通りに構築できる。このため、メタ・ディストリビューションとも呼ばれている。

Linuxで動作するソフト[編集]

  • GNU Emacs, vi(Vim) テキストエディター
  • Mozilla Webブラウザ
  • Firefox Webブラウザ
  • Thunderbird メーラー(メールクライアント)・RSSリーダー
  • Opera Webブラウザ統合(Webブラウザ・メール・RSS・IRC)
  • OpenOffice.org オフィス統合(ワープロ、表計算、プレゼンテーションソフトなど)
  • GIMP 画像処理
  • LaTeX 組版
  • Samba
  • Apache WWWサーバ
  • bind DNSサーバ
  • xmgr
  • GCC コンパイラ
  • MATLAB
  • Mathematica 数学処理
  • Acrobat
  • xpdf

X Window System[編集]

UNIX上で動くGUI環境に、X Window Systemがある。これは、サーバー / クライアント方式でグラフィカルな環境を提供するもので、通常はこの上に各種ツールキットを使ってGUI環境を構築する。

この上で動く環境に、GNOMEKDEXfceWindow Makerなどがあり、通常はウィンドウマネージャーや、周辺ツールが提供されている。また、ツールキットとしてはGtkQtwxWidgetなどがあり、これらを通じてグラフィカルなアプリケーションを作成出来る。

特にGNOME、KDEは、テキストエディタやファイルマネージャー、オフィスアプリケーションなどの周辺アプリケーションもあわせて提供されており、まとめて導入することによって、WindowsやMac OSなどといった先行するオペレーティングシステムに負けない程度の環境を作ることが出来る。

Linuxリンク[編集]

Yahoo!JAPANのLinuxディレクトリー