UNIX/Linux入門
情報技術 > UNIX/Linux入門 大学の学習 > UNIX/Linux入門
UNIXとは[編集]
UNIXの起源はアメリカ・AT&T社のベル研究所が開発したOSである。後にカリフォルニア大学バークレー校で学術目的に実装され、ベル研究所のUNIXとカリフォルニア大学バークレー校のUNIX (BSD) 両者が現在広く用いられているUNIXの源流をなしている。
マルチユーザ・マルチタスク機能を発表当初から持っており、ネットワークを介して異なる端末から更新作業などを行える環境をいち早く作り上げた。しかも、マルチタスク機能で、同時にログインして同時に作業することもでき、業務の効率を大幅に改善した。
UNIXの種類[編集]
以下現在主に使用されているUNIX系OSを挙げる。
UNIXを扱う上での基礎知識[編集]
操作インターフェース[編集]
基本的には、CUIで操作を行う。CUIとは、コマンドベースのインターフェイスのことで、一定の書式に則った文字列(これをコマンドという)を入力することでコンピュータを操作する体系である。近年、ウィンドウシステムの発達もあって、特にクライアント分野では起動から終了までGUI(CUIに対して、視覚的に操作できる体系)で操作を完結できる環境が整いつつあるが、簡素かつ強力なコマンドラインベースの操作環境は根強く支持されている。GUIを採用しているシステムでも、GUI環境中でコマンドを実行するためのアプリケーション(ターミナルエミューレータと呼ばれる)を利用するのが一般的である。
ファイルシステム[編集]
UNIXでは、ファイルをディレクトリで管理する。ディレクトリはWindowsのディレクトリーに対応するものであり、複数のファイルを収めることができる。さらに、ディレクトリ内に別のディレクトリがあっても良いので、ディレクトリ群は木構造になる。
この構造の頂点となる最上位のディレクトリがただひとつある。これをルートディレクトリと呼び、/
と書く。
なお、root管理者権限がないとアクセスできないディレクトリとして root
という名前のディレクトリがあるが、しかしコレは(頂点のディレクトリという意味での)「ルートディレクトリ」とは、意味が違う。
ディレクトリ構造上の位置をパス (path)と呼ぶ。パスを表記する際は、ディレクトリを上位から順にスラッシュで区切って並べる。例えば
/export/home/user01/main.txt
というパスは、「ルートディレクトリの中にあるexportディレクトリの中にあるhomeディレクトリの中にあるuser01ディレクトリの中にあるmain.txtというファイル」を意味している。
初期状態では /etc ディレクトリなど必須のディレクトリ・ファイルは既に構成されているが、自分でディレクトリやファイルを新たに作ったりすることもできる。
また、処理を行うときは「自分がいる場所」すなわちカレントディレクトリでの処理が基本となるので、CUIではカレントディレクトリを把握しているか、明示的に確認する必要がある。
コマンド[編集]
コマンドとは、コンピュータ上で処理を行うための、特定の書式に則った一連の文字列である。コマンドを入力し、実行する(通常はEnterキーを押す)ことで、そのコマンドに応じた処理が実行される。
例:
[user@localhost ~]$ date
- 実行結果
2020年 2月 22日 土曜日 20:26:11 JST
- コマンドの例における$は、コマンドが入力できる状態であることを示すために表示された文字で、「プロンプト」と呼ばれる。プロンプトは場合によって異なるがここでは$を用いている。
この例では、'date'というコマンドを実行している。これにより、コンピュータは'date'という指示を受け、その結果'Sun Feb 12 22:11:48 JST 2006'を返す。結果は、この場合画面に表示されているが、正常に処理が行われた場合に何も表示しないコマンドも多い。
コマンド名に続けて文字列をスペースで区切って記述することで、コマンドに付加的な指示を渡すことができる。このような付加的な文字列を引数と呼ぶ。引数がどのように解釈されるかはコマンドによって異なるが、よくある使いかたとして、コマンドの挙動を変更するためのオプションとして使うというものがある。オプションは、通常'-'に続けた一字のアルファベットか、'--'に続けた意味のある語句によって指定される。
[user@localhost ~]$ date -u
実行結果
2020年 2月 22日 土曜日 11:30:04 UTC
この例では、'date'というコマンドに'-u’というオプションを付けている。これによりdateコマンドの動作は変更されている。この場合は、dateコマンドの仕様に従い、ローカルマシンの時刻からUTC(協定世界時)へと表示される時刻が切り替えられている。
また、コマンドには、引数として操作対象を受け取るものがある。
例:
$ rm test.txt
この例では、'rm'というコマンドに'test.txt'というファイルを指示している。これにより、'rm'というコマンドを通じて、'test.txt'というファイルを操作する。'rm'というコマンドはファイルを消去するので、この場合はtest.txtが消去される。(Fedora 31 でのテストの結果、コマンド実行後は test.txt はゴミ箱にも無く、完全に消える。)
シェル[編集]
シェルとは、コンピュータに対して指示を出す際に利用される対話プログラムである。コンピュータにコマンドを入力するとき、実際にはシェルに対して入力している。シェルは入力されたコマンドを解釈し、実行する。シェルは複数開発されており、どのシェルを適用しているかによって、コマンドの表現方法が違ったり、同じ意味でもコマンド自体が違ったりする場合もある。
Bシェル、ksh、bash、zsh、csh、tcshなどがある。Linuxの各ディストリビューションでは、bashをデフォルトのシェルに指定していることが多々ある。
標準入力、標準出力、標準エラー出力[編集]
コマンドが実行されるとき、コマンドには必ず入出力のための三つの経路、標準入力、標準出力、標準エラー出力が割り当てられる。コマンドは必要に応じてこれらの経路から入力を受け取ったり、出力を書き出したりする。この三つの経路を総称して標準入出力という。
- 標準入力
- 標準入力はコマンドへの情報の入力源である。標準入力を利用しないコマンドもある。通常は、利用しているコンソールからのキーボード入力を標準入力とする。
- 標準出力
- 標準出力とは、コマンドが出力した結果を返すところである。通常は、利用しているコンソールが出力先となる。
- 標準エラー出力
- 標準エラー出力とは、プログラム上エラーとして指示された出力で、通常は利用しているコンソールが出力先となる。
例えば、上記のdateの例で、dateコマンドの出力内容が画面に表示されたが、実はこの時の出力は標準出力に送られている。上記では標準出力の行き先が画面だったため、結果として画面に表示された。
標準入出力の行き先は必要に応じて変更することができる。
例:
$ date > date.txt
コマンドとして入力する文字は 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コマンドの出力の行数・単語数・バイト数を数えている。
パイプやリダイレクトを使うと、限られたコマンドで自在に多様な操作を行うことができる。
変数[編集]
シェルでは変数を設定することができます。
たとえば、
$ a=rrr
と入力すると、変数 a に 文字列rrrが代入されます。
$ echo $a
のように、変数名の前にドル記号$をつけてechoコマンドを実行すれば
rrr
と表示されます。
echoコマンドは、指定した文字列 または 変数($が必要)を表示するコマンドです。
$記号がないと、
$ echo a
- 表示結果
a
のように、そのまま表示します。
環境変数[編集]
環境変数とはプログラムやアプリケーションが参照する情報を保持する変数のことであり、UNIXではシェルによって管理されている。
例えば、
- ホームディレクトリ(ログインした直後のカレントディレクトリ)はどこか?
- 使用言語は何か?
- ログイン名は何か?
といった情報に該当する環境変数を変えることで情報を書き換えることができる。ただし、適用しているシェルによって設定方法は異なる。
例えばbashを使用していて使用言語 (LANG) を日本語 (ja) としたい場合は
$ export LANG=ja
といった具合である。
通常、環境変数は、大文字で指定される。環境変数を設定、取り消しするコマンドはシェルによって異なる。
なんらかの環境変数を確認するには、echoコマンドを使えばいい。たとえば、使用言語を調べたいなら、使用言語の環境変数はLANGなので
例:
$ echo $LANG
- 実行結果
ja_JP.UTF-8
といった風になる。
echo は、なにらかの出力をシェル端末で行うコマンドである。 頭文字に「$」のついた英単語は、変数である。つまり「$LANG」は、変数LANGである。
コマンド「echo $LANG」により、変数LANGをシェルで表示する作業が実行される。そして変数LANGの内容が使用言語なので、そのパソコンの使用言語が表示される、という仕組みである。
ユーザー[編集]
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を扱う上で非常によく用いられるコマンドについてまとめる。これらのコマンドは実際にはシェルの機能ではなく、一つのアプリケーションであることに注意が必要である。しかし、これらのコマンドは通常シェルから起動されることから、これらをシェルのコマンドと呼ぶことが多い。
基本コマンド[編集]
cd[編集]
cd はディレクトリ移動のコマンドである。
cd ~
で初期ディレクトリに移動。「cd」とは change current working directory の略である[1]。
なお、ここでいう初期ディレクトリとは、「コマンド端末の起動時の初期設定での、ディレクトリの開始地点」という意味である。 コマンド端末の画面で、
[ユーザー名@localhost ~]$
というような表示で始まるが、その「~」のことである。
じつは、Linux では、「~」と表示されているが、正体は「~」ディレクトリー階層
- /home/ユーザー名
のことである。(少なくとも、一般ユーザーとしてLinuxにログインしている場合は、そうである。)
pwd
というコマンドを使うと、現在いるディレクトリー階層をコマンド端末に表示するのだが、起動直後にpwdコマンドを試してみると、コマンド端末の返事で
/home/ユーザー名
というふうに、正体を自白する。なお、pwdとは Print Working Directory または Present Working Directory などの略だろうと言われている。(パスワードとは無関係)
用途として、たとえばディレクトリーを移動していて作業をいろいろとしたあとに、初期設定のディレクトリーの場所に戻りたいときなどに、よく cd ~
を使うことになる。
cd /home
でホームディレクトリに移動。((( $HOME と混同している、以下パスに混乱がある)))
日本語化されたGNU/Linux環境なら home ディレクトリに「ダウンロード」とか「ドキュメント」などのディレクトリーがある。
なお、「root」ディレクトリーや「dev」ディレクトリーや「etc」ディレクトリーなどのあるディレクトリーをよく見てみると、そこに「home」というディレクトリーもあり、実は、これに移動している。
日本語環境の場合、たとえばホームディレクトリーにある「ダウンロード」ディレクトリーに移動したいなら、
cd ~
で、ホームディレクトリーーに戻った後に、
cd /ダウンロード
のように入力すればいい。
cd /
そのLinuxのインストールされたOS内での、一番 上のディレクトリに移動する場合、cd /
で移動できる。
たとえば「usr」ディレクトリというのが、初期設定で「コンピュータ」ボタンを開いた場所に存在するので、そこに移動したい場合なら、
cd /usr
コマンドで移動できる。
cd ../
いまいるディレクトリーの、ひとつ上のディレクトリーに移動する場合、../
で移動先を表現する。
もし、ひとつ上のディレクトリーに「hitotuue」というディレクトリーがあって、そこに移動したいなら、コマンドは
cd ../itotuue
となる。
cd ディレクトリ名
たとえば、cd test
なら、もし現在いるディレクトリに「test」というディレクトリがあれば、その「test」ディレクトリーに移動する。
このように、現在いるディレクトリーを起点にして移動先などの位置を表現する形式のことを「相対パス」という。
ディレクトリ名に、「.」や「/」などといった記号を何もつけず、cd のあとに単にディレクトリ名だけを書けば、それは相対パスである。
いっぽう、 cd ~
や cd /
などは、現在いるディレクトリーとは無関係に移動する形式であり、このように現在位置とは無関係に移動先などの位置を表示する形式のことを「絶対パス」という。
cd /etc
や cd /home
のように、cd /
で始まる形式なら絶対パスの形式である。
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ページを探すディレクトリは、環境変数MANPATHに記憶されている。これは、多くの場合 /usr/share/manなどであり、ここにはシステムで用意されているmanページのほとんどが保存されている。システムに興味がある場合はこれらに目を通すとよい。
date[編集]
dateは、現在の日付と時刻を返すコマンドである。dateコマンドは、日付を設定する目的でも用いることができる。
例:
$ date
現在の日付と時刻を返す。
$ date 日付
現在の日付を設定する。日付の書式については、manを参照のこと。
dateは、システムのロケールによって、表示を変える。
$ 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の変数で置き換える。
sudo[編集]
sudoのあとに管理者権限で実行したいコマンドを書く
例: $ sudo apt update
テキスト関係[編集]
テキスト閲覧[編集]
まず、閲覧したいテキストファイルのある場所まで、cdコマンド(シェルのディレクトリ移動のコマンド)で移動する。
ファイルを表示する場合、
- more
- less
- cat
などのコマンドがある。
これらのコマンドの内容の違いは、テキストファイルを表示するさいに、一括で出力するか、それとも段階的に出力していくかといった、違いである。
$ more aaa.txt
のように入力する。なお、これはファイルaaa.txtの内容を表示するコマンドである。
つまり
more ファイル名
の書式である。
more[編集]
moreでは、大きなテキストの場合には段階的に、冒頭から出力していく。表示しているテキストの続を見たい場合はエンターキーを押すなどすると、続きが表示される。
less[編集]
大きなテキストの場合には段階的に、冒頭から出力していく。
$ less aaa.txt
aaaの内容を表示する。
表示しているテキストの続を見たい場合は
- エンターキーを押すと、続きが表示される。
- マウスの中央ホイールによるスクロールでも、テキストの続きが表示される。
また、長い標準出力を見るのにも使う 例: $ ls /etc | less
lessは他のコマンドと比べると大きいファイルで、内容も豊富である。詳細な内容は、manを参照すること。
cat[編集]
ファイルの内容を最後まで表示する。複数のファイルが指定された場合にはそれらのファイルを続けて表示する。
$ cat aaa bbb
aaaとbbbの内容を連続して標準出力に出力する。
エンターキーを押しても、スクロールはされない。
catコマンドでは、テキスト出力はすでに終わった状態になる。
シェルには表示画面が残されているが、次のコマンドの受付がすでに開始されてしまっているので、エンターキーを押すと、空白のコマンド入力になってしまう。
テキスト操作[編集]
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」とだけコマンド入力した場合には、カレントディレクトリの中身を記述する。作成したファイルやディレクトリが実際にディレクトリ内に存在するかどうかを確かめるために用いることができる。
例
[user@localhost ~]$ ls
- 表示結果
date.txt test.txt テンプレート ドキュメント 音楽 公開 'test (コピー).txt' ダウンロード デスクトップ ビデオ 画像
このコマンドは、GUIを用いる場合には存在しないだろう。なぜなら、GUIを用いる場合には、ディレクトリに存在するファイルは常にアイコンとして表示されており、コマンドを用いて見る必要はないからである。
また、下記のように、
$ ls ディレクトリ名
と入力した場合、そのディレクトリが存在するならば、そのディレクトリ名の中身が表示される。
たとえば 例
[user@localhost ~]$ ls ドキュメント
- 表示結果
原稿 予定表
この場合、ファイル「原稿」とファイル「予定表」が、「ドキュメント」ファイルに存在しているとシェルは報告している。
なお、ファイル名にlsコマンドを使うと、そのファイルが存在していれば、そのファイル名をそのまま表示する。
例
[user@localhost ~]$ ls test.txt
- 表示結果
ls test.txt
なお、ls で存在しないファイル名や、存在しないディレクトリー名を入力すれば、存在しない旨が報告される。
[user@localhost ~]$ ls detarame.txt
- 表示結果
ls: 'detarame.txt' にアクセスできません: そのようなファイルやディレクトリはありません
lsにはいくつかのオプションがあるが、よく用いるものをまとめる。-lは、ファイルやディレクトリについてより詳細な情報を与える。情報は、パーミッション、ファイルサイズ、作成者、作成された時間、最後に変更された時間などである。実用上は、-lだけではなく、-hもつけるとファイルサイズが人間にとって読みやすい形でかかれるため、使いやすくなる。
-a は、ディレクトリ内にある全てのファイルを表示する。通常のlsでは、最初が.から始まるファイルやディレクトリは表示されない。これは、設定ファイルやアプリケーションが内部的に用いるファイルが毎回表示されると場所塞ぎだからである。これらが存在するかどうかを調べるためには、明示的に-aオプションを用いる必要がある。
-Rオプションは、ディレクトリを再帰的に下降してファイルを表示する。再帰的とは、ファイルが存在すればそれを表示し、ディレクトリが存在すればそのディレクトリに移動し、再び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オプションはできる限り常に用いるようにした方がよいだろう。システムによっては、エイリアスなどの機能を駆使して、これらの振舞いが通常となるように設定している場合もある。
しかし、システムを過信せず、自分で気をつける方が望ましい。-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の'ゴミ箱'と違い一度消去したファイルは取り戻せないので、注意が必要である。不測の事態を避けるために、作成したファイルはこまめにバックアップを行うことが望ましい。バックアップには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[編集]
正規表現[編集]
正規表現はあるルールで指定される文字列の集合のことを指す。正規表現を用いて複数のファイルを指定したり、文書中から当てはまる文字列を検索することができる。正規表現自体はあらゆるOS上で利用される技術だが、特にUNIXのシェルには正規表現を用いる技術が多くあるのでここでまとめる。
正規表現は複数の文字列が当てはまる'性質'を示す事ができる。例えば、a,aa,aaa,aaaa,... などの文字列はaが連続的に並ぶという性質を持っている。このような名前のファイルを同時に消去したいときには、aが連続的に並ぶという性質を指定できると便利である。egrepや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オプションには glob を用いることができる。例えば、
$ find . -name 'f*.txt'
は、fではじまり.txtで終わるファイル(file.txt, ffff.txt, ...などがあてはまる)を探す。 シングルクォーテーション(')で囲んでいるのは、カレントディレクトリにある f*.txt とのマッチングを行わせないため。
シェルスクリプト[編集]
上のコマンドの例では、コマンドは全て1つずつ入力され、 それぞれのコマンド実行に対してそれぞれの結果が返ってきた。 このように上記の例ではすべてシェルを対話的に扱ってきたが、 あらかじめシェルに実行させたいコマンドをファイルに書いておき、 これをまとめてシェルに実行させることも可能である。 このコマンドを書いたファイルをシェルスクリプトと呼ぶ。
シェルスクリプトの書き方はシェルの種類によって異なるので、 以下ではLinuxやMac OS Xの標準のシェルであるbash (Bourne Again Shell) を例にとって説明する。
最初のシェルスクリプト[編集]
シェルスクリプトとは言っても、基本的にはコマンドを書き並べたものである。
#!/bin/bash echo hello uname
これは、「はじめにhelloと表示し、次にOSの名前を表示する」シェルスクリプトである。 行の中の#以降の部分はシェルに解釈されないコメントである。 1行目のコメントには特殊な意味があるので後述する。
プロセス管理[編集]
UNIXでは複数のプロセスを同時に動かせる。ここでは、実際に複数のプロセスを動かす方法を述べる。プロセスは互いに独立で、通常は別のプロセスの動作にかかわり無く動く。そのため、他のプロセスの動作を制御したいときには、シグナルを利用する必要がある。シグナルは、他のプロセスに送ることができ、プロセスを中断する等の効果がある。
&[編集]
&は、コマンドの後につけてそれをバックグラウンドで動かす機能がある。これは複数のプロセスを起動したい時に用いられる。
例:
$ 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
自分だけでなく他のユーザーが実行したプロセスも表示する。このオプションは、デーモンプロセスを見るためによく用いられる。
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
ファイルシステム[編集]
ファイルシステムは、コンピュータに蓄えるデータをどのように配置するかを定める。ファイルシステムを扱うには、ディスクにパーティションを定める必要がある。パーティションを定めた後には、それぞれのパーティションに対してファイルシステムを導入する。
パーティションとファイルシステムは、通常一度定めたら情報を消すこと無く変更することはできない。これは、ファイルシステムを変更すると情報の蓄え方を変更することになり、以前あったデータの場所に関する情報を利用できなくなるからである。そのため、最初にパーティションとファイルシステムを作成するときには、利用法を考えて慎重に作業を行う必要がある(ただし、そのような作業を行うツールも知られていることには注意が必要である)。
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でよく用いられていたファイルシステムに、ext2ファイルシステムがあるが、これを作成するときには、
# mke2fs パーティション名
を用いる。 ここではrootのプロンプトを#で表している。
du[編集]
df[編集]
mount[編集]
mountは、記憶媒体中のファイルシステムにアクセスできるようにするコマンドである。mountが扱えるファイルシステムもOSによってばらばらである。ここではLinuxのmountについて述べる。
mountは、マウントするデバイス名とデバイス内のファイルシステムを設置する場所を指定して用いる。設置する場所は空のディレクトリならどこでもよい。mountする際ファイルシステムを指定する必要がある(省略しても自動で判断する場合もある)。ファイルシステムを指定するには、-tオプションを用いる。
例:
# mount -t ext2 /dev/hda3 /mnt
ext2ファイルシステムを持つIDE接続のハードディスクの3番目のパーティションを/mntディレクトリにマウントする。
# mount -t vfat /dev/sda1 /mnt
Windows形式にフォーマット(ファイルシステムを作成すること)された記憶媒体(フロッピーディスク、USBメモリ)を/mntディレクトリにマウントする。VFATは、Windowsで標準的に用いられるファイルシステムである。ただし、ここではSCSIデバイスはSCSI接続されているとした。実際にSCSIの機器でなくてもUSBの記憶媒体はSCSIとして扱われるものがあるため、多くの機器が/dev/sd*として扱われる(具体的にはen:w:USB mass storage device classのドライバで扱われるデバイスはSCSIデバイスとして扱われる。driver/usb/storage内のファイルを参照)。
# mount -t nfs 192.168.0.2:/pub /mnt
(おそらく)他のコンピュータ上にある/pubというディレクトリを/mntディレクトリにマウントする。NFSは、Linuxで用いられるファイルサーバであり他のコンピュータ上のファイルシステムをマウントするために用いられる。NFSに関する説明は後述。
umount[編集]
umountは、mountしたディレクトリを取り除くためのコマンドである。umountは、
# umount マウントしたディレクトリ名
のように使う。
fsck[編集]
/etc/fstab, /etc/mtab[編集]
デバイスファイル[編集]
デバイスファイルはコンピュータに接続された機器にアクセスするためのファイルである。デバイスファイルは、デバイスへのインターフェースでありデバイスそのものではないため、デバイスファイルを削除しても(通常は)問題がない。例えば、/dev/hda1を削除しても、ハードディスクの中身が消えることはない。
また、デバイスファイルはたいてい/dev以下に置かれるが、それ以外の場所においても同じように扱うことができる。ただし、デバイスファイルはデバイスの識別のためにメジャー番号とマイナー番号を持っているため、それらはデバイス毎に使い分ける必要がある。
デバイスファイルを作成するには、mknodコマンドを用いる。mknodは作成するファイルの名称、メジャー番号、マイナー番号、デバイスの種類を指定して作られる。デバイスの種類とは、b:ブロック型、c:キャラクタ型のどちらかである。
エディタ[編集]
慣用的に、シェルで、テキストファイルを作成、編集するためのソフトウェアのことが、単に「エディタ」と呼ばれている。UNIXの設定ファイルはほとんどがテキストファイルであるため、エディタの重要性は大きい。
vi[編集]
viは広く用いられるUNIXのテキストエディタである。viはほとんど全てのシステムで用意されているため、基本的な設定ファイルの記述にはこのエディタが用いられることが多い。ただし、動作が他のエディタとは異なっているため、その使用には好みがわかれるエディタでもある。詳しい操作はviを参照。
Xウィンドウシステム[編集]
XウィンドウシステムはUNIX上でGUIを実現するためによく用いられるプログラムである。
Linuxとは[編集]
Linuxとは、1991年にフィンランドのプログラマ リーナス・トーバルズがヘルシンキ大学在学中にMinixより優れたMinixを作るために立ち上げたプロジェクトで開発しGPLで公開したLinuxカーネルを元にしているOSである。 公開当初は、とても貧弱であったが、すぐにハッカー達の支持を受け利用者を増やしていった。安価で手軽にUNIXと類似の環境を得られることからインターネット・サーバとして頻繁に利用されるようになってきた。
GNUについて[編集]
Linuxはカーネルしかなく、Linuxのみで動かすことは出来なかった。しかし、フリーなオペレーティングシステムを作ることを目的としていたGNUプロジェクトは、カーネルや、一部のデーモンなど以外をフリーなソフトウェアとして完成させていた。GNUのglibcやBash、その他の多くのコマンドといった主要なソフトウェアとLinuxにのカーネルを合わせることで、実際に動かして使うことのできるオペレーティングシステムを作ることが出来た。そのため、LinuxのカーネルとBashやglibc、gcc、などといった主要なソフトウェアを合わせてGNU/Linuxと呼ぶこともあり、GNUプロジェクトなどは推奨している。 Linuxに収められているソフトの多くは、GNUのGPLやLGPLといったライセンスで配布されている。
Linuxの種類 ディストリビューション[編集]
自分で Linux カーネルや、gcc など、基本的なソフトウェアをそろえ、コンパイルして、システムを構築するのは労力がかかり、多くの知識が必要となる。そのため、利用者が簡単にLinuxシステムをインストールできるように、ディストリビューションと呼ばれる、インストーラーを使うと、すぐに完成したLinuxのシステムとして使えるものが作られた。現代的なディストリビューションの多くには、簡単に追加のソフトウェアがインストールできる、パッケージという仕組みがある。後述するが、Debian系ではDEB、RedHat系ではRPMが主に使われる。
ディストリビューションの分類[編集]
ディストリビューションの系統として主にパッケージ管理システムの違いによって3種に分類されるが、どれにも属さないものもある。
- Red Hat 系
- RPMと呼ばれるパッケージ管理システムを持っている。Red Hat Enterprise Linux、Fedora、Cent OS など。
- Debian 系
- dpkg という RPM 形式よりも強力なパッケージ管理システムを持っている。Debian GNU/Linux や KNOPPIX、Ubuntu、Linux Mint など。
- Slackware 系
- Red Hat 系のような固有のパッケージ管理システムは無く、ユーザが自分でソフトウェアや、そのソースファイルを管理する。自由度が高いが、知識が必要。Slackware や Plamo Linux。
主なディストリビューション[編集]
よく使用されているディストリビューションを以下に挙げる。
- Red Hat Enterprise Linux
- 企業におけるサーバシステムの構築やクライアント利用のためのディストリビューション。RHELと略される。
- Cent OS
- RHELのソースコードをもとに作られる、コミュニティ無料版。
- Fedora
- 未来のバージョンのRHELに組み込まれる予定の新機能などをテストしたりするためのテスト的なバージョンがFedoraである。常に最新のソフトウェアを搭載しており、少し不安定なところもあるが、最新のソフトウェアを使いたい人に人気がある。
- Debian GNU/Linux Debian Project
- 非企業のコミュニティ主体のOSのひとつである。最古参のディストリビューションの一つで、現在開発されているLinuxディストリビューションの中でSlackwareの次に昔からあるLinuxディストリビューション。独自のパッケージ管理システム deb を採用している。インストールが難しい、と言われていたが、Debian-Installer Project によって改善された。Debian LiveにあるインストーラーはCent OSなどと同じインストーラーを使っており、Debianインストーラーより更に使いやすくなっている。また、UbuntuやMint Linuxのような主要なOSのベースとなっている。
- Ubuntu
- Debianから派生したディストリビューションであるが、Canonicalという企業が開発を主導している。デスクトップでの使用をメインにしており、現在では人気の高いディストリビューション。
- SUSE Linux (現 openSUSE)
- 欧米で人気が高く、歴史が古い。先進的ではあるが安定的でないカーネルを搭載するのを避け、少し枯れてはいるが安定性の高いソフトウェアを採用している。また、Xgl、AppArmor等の開発でも知られる(一部openSUSEより引用)。
- Gentoo Linux Gentoo Linux Users Group Japan
- BSD の ports に似た独自のパッケージ管理システム portage を採用し、さまざまなシステムを思った通りに構築できる。このため、メタ・ディストリビューションとも呼ばれている。
Linuxで動作するソフト[編集]
- GNU Emacs, vi(Vim) テキストエディター
- Mozilla Firefox Webブラウザ
- Mozilla Thunderbird メーラー(メールクライアント)・RSSリーダー
- Opera Webブラウザ統合(Webブラウザ・メール・RSS・IRC)
- OpenOffice.org オフィス統合(ワープロ、表計算、プレゼンテーションソフトなど)
- GIMP 画像処理
- LaTeX 組版
- Samba
- Apache WWWサーバ
- BIND DNSサーバ
- xmgr
- GCC コンパイラ
- MATLAB
- Mathematica 数学処理
- Adobe Acrobat
- Xpdf
X Window System[編集]
UNIX上で動くGUI環境に、X Window Systemがある。これは、サーバー / クライアント方式でグラフィカルな環境を提供するもので、通常はこの上に各種ツールキットを使ってGUI環境を構築する。
昔は、ツールキットや、デスクトップ環境、各種ソフトウェアが別々に配布されており、デスクトップの環境を作るのが大変だった。それを解決するものとして、ツールキット、デスクトップ環境、各種ソフトウェアなどをまとめて、統合デスクトップ環境というものが作られた。
主な統合デスクトップ環境にGNOME、KDE、LXDE、Xfce、Window Makerなどがあり、ツールキットはGNOME系では主にGtk、KDE系では主にQt、が使われ、他にもwxWidgetなどがある。これらを使ってグラフィカルなアプリケーションを作成出来る。
特にGNOME、KDEは、テキストエディタやファイルマネージャー、オフィスアプリケーションなどの周辺アプリケーションもあわせて提供されており、まとめて導入することによって、WindowsやMac OSなどといった先行するオペレーティングシステムに負けない程度の環境を作ることが出来る。現在はGNOMEが優勢で、他にもとても軽量なLXDEなどを使う人も増えている。
UNIX/Linux リンク[編集]
- ^ chdir(2)