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 File Systemのユーザー側から観た特徴について述べる。
UNIXでは、ファイルをディレクトリで管理する。ディレクトリはWindowsのフォルダーに対応するものであり[1]、複数のファイルを収めることができる。さらに、ディレクトリ内に別のディレクトリがあっても良いので、ディレクトリ群は木構造になる。
この構造の頂点となる最上位のディレクトリがただひとつある。これをルートディレクトリと呼び、/
と書く。
なお、 /root/
というディレクトリがあるが、こちらはファイルシステムの頂点のディレクトリという意味の「ルートディレクトリ」ではなく、ユーザー root のホームディレクトリである[2]。
ディレクトリ構造上の位置をパス (path)と呼ぶ。 パスには絶対パスと相対パスがある。
- 絶対パス
- ルートディレクトリを起点としたパス表現
- 例
/home/user01/main.txt
- 意味
- ルートディレクトリの中のhomeディレクトリの中のuser01ディレクトリの中のmain.txt
- 相対パス
- カレントディレクトリを起点としたパス表現
- 例
main.txt
- 意味
- カレントディレクトリが /home/user01/ ならば /home/user01/main.txt に同じ。
- カレントディレクトリ
- プロセスが暗黙に参照する相対パス表現の起点
- pwd(1) で相対パスで表示できる
- cd(1) で変更できる
- 記号 ’.’(カンマ1文字)で参照できる
- 親ディレクトリ
- あるディレクトリを包含するディレクトリ
- 例: /usr/local/bin/ の親ディレクトリは /usr/local/
- 記号 ’..’(カンマ2文字)で参照できる
- 例: /usr/local/bin/../../lib は /usr/lib/ に同じ。
- ホームディレクトリ
- ユーザーに割当てられたディレクトリ
- 環境変数 HOME で参照できる。
- 記号 '~'(チルダー1文字)で多くのシェルで参照できるが、全てのシェルで出来るわけではない。
ファイルシステムのレイアウトについては hier(7) を参照。
コマンド編集
コマンドとは、コンピュータ上で処理を行うための、特定の書式に則った一連の文字列である。コマンドを入力し、実行する(通常はEnterキーを押す)ことで、そのコマンドに応じた処理が実行される。
例:
$ date
- 実行結果
2020年 2月 22日 土曜日 20:26:11 JST
- コマンドの例における$は、コマンドが入力できる状態であることを示すために表示された文字で、「プロンプト」と呼ばれる。プロンプトは場合によって異なるがここでは$を用いている。
この例では、'date'というコマンドを実行している。これにより、コンピュータは'date'という指示を受け、その結果'Sun Feb 12 22:11:48 JST 2006'を返す。結果は、この場合画面に表示されているが、正常に処理が行われた場合に何も表示しないコマンドも多い。
コマンド名に続けて文字列をスペースで区切って記述することで、コマンドに付加的な指示を渡すことができる。このような付加的な文字列を引数と呼ぶ。引数がどのように解釈されるかはコマンドによって異なるが、よくある使いかたとして、コマンドの挙動を変更するためのオプションとして使うというものがある。オプションは、通常'-'に続けた一字のアルファベットか、'--'に続けた意味のある語句によって指定される。
$ 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コマンドの出力の行数・単語数・バイト数を数えている。
パイプやリダイレクトを使うと、限られたコマンドで自在に多様な操作を行うことができる。
シェル変数編集
シェルはコマンドインタープリターと呼ばれるように、言語インタープリターの一種で、変数を使うことが出来ます。
- Bash
$ a=xyz $ echo $a xyz $ echo a a
- 変数 a に 文字列xyzを代入します。
- 変数名の前に$(ドル記号)をつけてecho(1) を実行すれ
- (echo(1)は、指定した文字列 または 変数($が必要)を表示するコマンドです)
- $記号がないと、
- そのまま表示します。
- Csh
% set a=xyz % echo $a xyz % echo a a
- 変数 a に 文字列xyzを代入します。
- 変数名の前に$(ドル記号)をつけてecho(1) を実行すれ
- (echo(1)は、指定した文字列 または 変数($が必要)を表示するコマンドです)
- $記号がないと、
- そのまま表示します。
csh では、プロンプトが % であること、代入に set を前置することが bash との違いです。
いま使ってシェルが何かは、環境変数SHELLにセットされているので
- Bash
$ echo $SHELL /bin/sh
- Csh
% echo $SHELL /bin/csh
の様に確認できます。
環境変数編集
環境変数は、コンピュータ上で実行中のプロセスの動作に影響を与えることができる、名前と結びついた動的な値です。 環境変数は、プロセスが実行される環境の一部です。 例えば、実行中のプロセスはTMP環境変数の値を照会して一時ファイルを格納する適切な場所を見つけたり、HOMEでユーザーが所有するディレクトリ構造を見つけたりすることが可能です。 例えば、
- ホームディレクトリ(ログインした直後のカレントディレクトリ)はどこか?
- 使用言語は何か?
- ログイン名は何か?
といった情報に該当する環境変数を変えることで情報を書き換えることができる。ただし、適用しているシェルによって設定方法は異なる。
例えばbashを使用していて使用言語 (LANG) を日本語 (ja) としたい場合は
$ export LANG=ja
といった具合である。
通常、環境変数は、大文字で指定される。環境変数を設定、取り消しするコマンドはシェルによって異なる。
なんらかの環境変数を確認するには、printenvコマンドを使います。 たとえば、使用言語を調べたいなら、使用言語の環境変数はLANGなので
例:
$ printenv LANG
実行結果
ja_JP.UTF-8
といった風になる。
printenv(1) は、与えられた名前の環境変数の値を表示します。
環境変数を実行する時に指定するには env(1) を使います。
$ env LANG=ja_JP.UTF-8 date 2022年 6月10日 金曜日 15時09分45秒 JST $ env LANG=C date Fri Jun 10 15:09:50 JST 2022 $ env LANG=zh_TW.UTF-8 date 2022年 6月10日 星期五 15時10分18秒 JST
ユーザー編集
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」とは change current working directory の略である[3]。
cd はファイルシステム上に実行ファイルのある外部コマンドではなく、シェルに内蔵された内部コマンドである。
$ cd / $ ls bin dev etc home lib lib64 lost+found media mnt opt postinst proc root run sbin sys tmp usr var $ cd etcd bash: cd: /etcd: No such file or directory $ cd etc $ pwd /etc $ cd $ pwd /home/user1
- カレントディレクトリーをルートディレクトリー(/)に変更
- ls(1) はディレクトリーにあるファイルを一覧表示するコマンド
- (ディレクトリーを指定しないとカレントディレクトリーが対象になる)
- etcd にカレントディレクトリーを変更しようとした
- カレントディレクトリーのルートディレクトリー(/)直下には etcd はないので失敗
- 存在しないディレクトリにカレントディレクトリーを変えることは出来ない
- etc にカレントディレクトリーを変更しようとした
- これは成功してノーリアクション
- pwd(1) はカレントディレクトリーを絶対パスで表示する
- ルートディレクトリー(/)直下の etc なので /etc
- 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ページのほとんどが保存されている。システムに興味がある場合はこれらに目を通すとよい。
whatis編集
whatis は、コマンド名あるいはコマンドの機能をおぼろげに覚えているときに使います。
$ whatis 文字列
例:
$ whatis tty tty(1) - return user's terminal name IO::Tty(3) - Low-level allocate a pseudo-Tty, import constants. IO::Tty::Constant(3) - Terminal Constants (autogenerated) tty(4) - general terminal interface
info編集
info は、GNU/Linux で用いられるコマンドラインインタフェースで動作するハイパーテキストのヘルプビューアである。
info ノード名
として用いる。
bash のドキュメントが読みたいのであれば
$ info bash
とする。
infoは、texinfoプログラムによって生成された.infoファイルを読み込み、ドキュメントをツリーとして表示し、ツリーを横断したり、クロスリファレンスをたどったりするための簡単なコマンドを提供しする。
基本操作
- スペースバー -- 現在のツリーノード内を下へスクロールし、現在のノードの下にいる場合は、現在のドキュメントの次のノードへ移動する、このことで情報ファイルの内容を順次読み進めることができる。
- バックスペースキー -- 反対方向に移動する。
- ] -- 現在の文書内の次のノードに移動する。
- [ -- 現在の文書で前のノードに移動する。
- n -- 現在のノードと同じレベルの次のノードに移動する。
- p -- 現在のノードと同じ階層にある前のノードに移動する。
- u -- 現在のノードの親ノードに行く。
- l -- 最後に訪れたノードに移動する。
- q -- info を終了する
- カーソルをリンク(アスタリスクで始まる単語)の上に移動し、Enterキーを押すと、そのリンク先に飛ぶ。
- タブ -- カーソルを次の最も近いリンクに移動する。
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」とだけコマンド入力した場合には、カレントディレクトリの中身を記述する。作成したファイルやディレクトリが実際にディレクトリ内に存在するかどうかを確かめるために用いることができる。
例
$ ls
- 表示結果
date.txt test.txt テンプレート ドキュメント 音楽 公開 'test (コピー).txt' ダウンロード デスクトップ ビデオ 画像
このコマンドは、GUIを用いる場合には存在しないだろう。なぜなら、GUIを用いる場合には、ディレクトリに存在するファイルは常にアイコンとして表示されており、コマンドを用いて見る必要はないからである。
また、下記のように、
$ ls ディレクトリ名
と入力した場合、そのディレクトリが存在するならば、そのディレクトリ名の中身が表示される。
たとえば 例
$ ls ドキュメント
- 表示結果
原稿 予定表
この場合、ファイル「原稿」とファイル「予定表」が、「ドキュメント」ファイルに存在しているとシェルは報告している。
なお、ファイル名にlsコマンドを使うと、そのファイルが存在していれば、そのファイル名をそのまま表示する。
例
$ ls test.txt
- 表示結果
ls test.txt
なお、ls で存在しないファイル名や、存在しないディレクトリー名を入力すれば、存在しない旨が報告される。
$ 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(1)はカレントディレクトリの絶対パスを表示する。
- 例
$ pwd /home/user1/work
- (カレントディレクトリが /home/user1/work であった場合)
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
たとえば、テキストエディタの新規ファイルに上記をコピーペーストして、これをたとえば「test.sh」という名前でカレントディレクトリに保存する。
実行するには、コマンドラインで
./test.sh
とコマンドすればいい。
なお、上記コードは、「はじめに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 ディストリビューション[a](しばしばディストロと略される)は、Linux カーネルと、多くの場合パッケージ管理システムを含むソフトウェアの集合体から作られたオペレーティング・システムである。 Linuxユーザーは通常、Linuxディストリビューションの1つをダウンロードしてOSを入手する[4]。 パッケージ管理システムは、後述するが、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と略される。
- CentOS stream
- Fedoraでの上流開発とRHELでの下流開発の間に位置する中流Linuxディストリビューションである。
- Fedora(旧Redhat Linux)
- 将来のRHELに組み込まれる予定の新機能などをテストしたりするための、上流Linuxディストリビューションである。
- 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
- FreeBSD の ports に似た独自のパッケージ管理システム portage を採用し、ソースコードからのビルドを基本とするため、さまざまなシステムを思った通りに構築できる。このため、メタ・ディストリビューションとも呼ばれている。Google Chrome OSは当初Ubuntuをベースに開発されていたが、2010年2月に portage を採用するため、ベースOSをUbuntuからGentooに変更した[5]。
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のファイルシステムは、VMX/MS-DOS/Windowsと異なり、「ドライブ」はなく、ルートファイルシステムの下位の階層に別のファイルシステムをマウントすることで、ユーザーには単一のファイルシステムに見えるようにします。ただし、例えばファイルシステムを跨いでハードリンクを張ることは出来ないなど、全くユーザーが意識しないで済むわけではありません。
- ^ FHS(Filesystem Hierarchy Standard)以前の Unixでは、実際に
/
が、システム管理者 root のホームディレクトリでした。 - ^ chdir(2)
- ^ Linux From Scratch という、すべてのコンポーネントを手動で構築して、動作する Linux システムをインストールする方法もあります。これには当然ながら、コンパイル済みのLinuxディストリビューションをインストールするよりも長いプロセスが必要です。Linux From Scratchのサイトによると、この方法の利点は、コンパクトで柔軟かつ安全なシステムと、Linuxベースのオペレーティングシステムの内部動作のより深い理解が獲得できることです。
- ^ “Chrome OS、クロスコンパイルにGentooのPortage採用”. ITmedia (2010年2月18日). 2010年2月20日時点のオリジナルよりアーカイブ。2022年6月27日閲覧。