Linux 入門

2014年11月22日

はじめに

Linux は本来コマンドラインベースのシステムである。最近は GUI だけで操作できることが多いとはいえ、Windows や Mac OS X のコマンドラインが補助的なものであるのと比べると、Linux ではコマンドラインはいまだ大きな役割を果たしている。ここでは、Linux の基本と、コマンドラインの使い方を解説する。

Linux の基本

ユーザーとグループ

Linux には、ユーザーとそれが属するグループがある。ユーザーには管理者と一般ユーザーがあり、管理者を root と呼ぶ。これはファイルのアクセス権に関係している。ふつう、一般ユーザーは自分が作ったファイルだけを書き換えることができる。一方、root はすべてのファイルを自由にできる。

ファイルとディレクトリ

Linux のコマンドライン上では、いわゆる "フォルダ" のことを "ディレクトリ" と呼ぶ。ディレクトリはファイルの一種である。

ファイルシステム

Linux などのファイルシステムは、ディレクトリの中にファイルやそのまたディレクトリがあるという、ツリー構造になっている。Windows では Explorer、Mac OS X では Finder でツリーをたどっていくが、 Linux にもそのようなものがある。それは使っているデスクトップ環境によって異なる (GNOME では Nautilus、KDE では Konqueror や Dolphin など)。それらに対して、コマンドラインではキーボード入力のコマンドでディレクトリツリーをたどっていくことになる。

パス

ディレクトリツリー上のディレクトリやファイルの場所のことを "パス" という。パスはスラッシュで区切られる。たとえば "/usr/bin/xclock" などである。スラッシュの左にあるディレクトリを親ディレクトリ、右にあるディレクトリを子ディレクトリと呼んだりする。最上位ディレクトリ ("/") のことを "ルート" という。ルートからのパスを "絶対パス"、あるディレクトリからのパスを "相対パス" という。

カレントディレクトリ

ファイルを操作する場合、ディレクトリツリー上のどこかに位置しなければならない。その現在地のことを "カレントディレクトリ" とか "カレントパス" などと呼ぶ。

ホームディレクトリ

ユーザーにはそのユーザー専用のディレクトリがある。それを "ホームディレクトリ" と呼ぶ。コマンドラインからファイルにアクセスするとき、ふつう最初はホームディレクトリに位置する。

アクセス権

すべてのファイルには、その所有者とグループ、アクセス権が設定されている。アクセス権は所有者、グループ、その他に対して設定できる。アクセス権には実行、読み取り、書き込みの 3 種類あり、それぞれに許可・不許可を設定できる。

たとえば、自分で作ったファイルであれば、自分に対して読み取り・書き込み許可、グループとその他には読み取り許可が与えられる。プログラムの場合は、実行許可も与えられる。実行許可がついていないものは実行できない。また、他人が作ったファイルは、ふつうはグループやその他に書き込み許可が与えられないため、書き換えることができない。

シェル

ファイルにアクセスしたり、プログラムを実行するために、ユーザーとシステムの仲立ちを行うものを "シェル" という。Windows の Explorer も Windows におけるシェルである。コマンドラインを扱うと言ったとき、実際に扱うものはシェルである。

Linux のシェルには主に 2 つの種類がある。B (Bourne) シェル (sh/bash) と C シェル (csh/tcsh) である。Linux はデフォルトが B シェル (bash) である場合が多い。したがって、ここではシェルに bash を想定する。

シェルは、コマンドを羅列したテキストファイルを与えると、それらを一気に実行する機能がある。そのファイルを "シェルスクリプト" と呼ぶ。シェルスクリプトでバッチ処理を行うことも、シェルに対する基本設定を指示することもできる。

プロセス

Linux のプログラムは、"プロセス" という単位で管理される。Windows のタスクマネージャーで表示される "プロセス" と同じである。プログラムを強制終了させることを "プロセスを殺す (kill)" と言う。

ジョブ

シェルが管理しているプロセス (あるいはプロセスのまとまり) のことを "ジョブ" と呼ぶ。ジョブには "フォアグラウンドジョブ" と "バックグラウンドジョブ" がある。フォアグラウンドでジョブを実行する場合、そのジョブを実行している間は、そのジョブの入力要求に対する以外は入力を受け付けない。バックグラウンドでジョブを実行する場合は、ジョブを実行している間もコマンドを入力し続けることができる。

端末の起動

Linux におけるコマンドラインによる操作には、「端末」 (端末エミュレータ) を使う。たとえば GNOME 2 や MATE では、デスクトップメニューの [アプリケーション]-[アクセサリ]-[端末] で起動できる。

ウインドウが現れ、キーボードで文字を入力できるようになる。

コマンドの実行

コマンドは次の形で実行する。

$ コマンド [オプション] 引数1 引数2 ...

"$" を "プロンプト (入力促進文字)" と呼ぶ。これはシェルが表示するもので、コマンド入力待ちであることを意味する。プロンプトは環境によって異なる場合がある。コマンドには "オプション" を空白区切りで指定できる。オプションは "-..." とか、"--..." などとハイフンの後に文字列という形で指定する。上の "[...]" は省略可能を意味している。コマンドの後に引数 (たとえばファイル名など) を空白区切りで指定する。

"ls" コマンドの例を見てみましょう。

$ ls

ただ "ls" とだけ入力すると、カレントディレクトリのファイルのリストが表示される。

$ ls -l

オプション "-l" をつけると、カレントディレクトリのファイルの詳細な情報が表示される。

$ ls --help

オプション "--help" をつけると、ls の使い方が表示される。

$ ls ..

".." はカレントディレクトリの親ディレクトリのパスを意味する。これは親ディレクトリのファイルを表示させている。

特殊な文字

特殊な扱いをされる文字がある。

. (ピリオド)

パスとして使うと、カレントディレクトリのパスを意味する。

$ ./run

コマンドとして使うと、シェルの設定の読み込みを意味する。

$ . ~/.bashrc

.. (ピリオド 2 つ)

カレントディレクトリの親ディレクトリのパスを意味する。

$ cd ..

~ (チルダ)

ホームディレクトリのパスを意味する。たとえば "~/.bashrc" など。

$ . ~/.bashrc

* (アスタリスク)

文字列のパターンを指定するときに使う。なんらかの文字列を意味する。たとえば、"*.txt" だと、最後に ".txt" が付くすべてのファイル名を意味する。

$ ls *.txt

?

文字列のパターンを指定するときに使う。"*" と異なり、なんらかの 1 文字を意味する。たとえば、"?.txt" だと "a.txt" や "b.txt" などがマッチする。

$ ls ?.txt

" (二重引用符)

"..." という形で表すと、空白を含む文字列を指定することができる。

$ grep -rin "error number" .

>

リダイレクト。コマンドの出力をファイルにつなげる。たとえば

$ run > log
とすると、run の結果が log というファイルに書き出される。

ただし、プログラムの出力には "標準出力" と "標準エラー出力" がある。"標準エラー出力" はエラーの出力に使われる。">" では標準出力だけがファイルに書き出される。標準エラー出力もリダイレクトするには次のようにする。

$ run > log 2>&1

>>

">" の場合はファイルを新しく作るが、">>" はコマンドの出力をファイルの末尾に追加する。

$ run >> log

|

パイプ。コマンドの出力を別のコマンドの入力につなぐ。たとえば

$ run | grep -i error
とすると、run の出力を grep コマンドに渡して grep を実行することになる。

&

コマンドの末尾につけると、バックグラウンドでの実行を意味する。

$ run &

キーバインド

Ctrl キーを押しながらあるキーを押すような形のショートカットキーが使える。これを "キーバインド" と呼ぶ。

Ctrl+C

フォアグラウンドで実行中のプログラムを強制終了する。

Ctrl+D

EOF (End Of File) を入力する。Python の終了などに使うことがある。

Ctrl+S/Ctrl+Q

Ctrl+S で画面を停止、Ctrl+Q で再開する。ふつう使わないが、うっかり Ctrl+S を押してしまったときは Ctrl+Q で戻ると覚えておく。

Ctrl+L

画面をクリアする。

Ctrl-A

行頭に移動する。

Ctrl-E

行末に移動する。

Ctrl+W

直前の単語を削除する。

Ctrl+U

カーソル以前の文字を削除する。

Ctrl+K

カーソル以降の文字を削除する。

Ctrl+Y

削除した文字を貼り付ける。

コマンドの補完

コマンド入力の途中、Tab を押すと入力が補完される。候補がいくつかあるときは候補が表示される。

コマンド履歴

実行したコマンドは記録されている。実行したコマンドを再度実行したい場合は、矢印の上下でコマンド履歴をたどることができる。

変数と環境変数

シェルでは変数を定義できる。変数には "環境変数" という環境設定用の特別な変数がある。環境変数はシェルや各種プログラムが参照する。

"env" コマンドで設定されている環境変数を確認できる。

$ env

環境変数 "PATH" の値を確認するには、次のようにする。

$ echo $PATH

"echo" は引数を文字列として出力するコマンドである。シェルは "$..." の形で表された単語を変数として、その値に置き換えるので、上のコマンドで変数の値を確認できる。

シェルでは、次のようにして変数を定義することができる。

$ VAR=value
$ echo $VAR

しかし、これは変数が定義されただけで、環境変数にはなっていない (env のリストに出てきない)。これを環境変数にするには次のようにする。

$ export VAR

これで、env の出力の中に "VAR" が出てくるようになる。次のように一度で環境変数を定義することもできる。

$ export VAR=value

一番重要な環境変数は "PATH" である。PATH には実行ファイルのあるディレクトリのパスのリストが設定してあり、これらのパスに含まれる実行ファイルは、いちいちそのファイルまでのパス ("フルパス" という) を指定しなくてもファイル名だけで実行できる。PATH には ":" (コロン) で区切られたパスのリストを設定する (たとえば "/bin:/sbin:/usr/bin:/usr/sbin" など)。PATH にパスを追加するには、次のようにする。

$ export PATH=~/bin:$PATH

値に "$PATH" を使っていることに注意する。$PATHの前に新しいパスを追加している形になっている。そうしないと既存のパスが消える。パスを追加することを "パスを通す" と言うことがある。コマンドが実行できないときには「パスが通っていない」と言ったりする。

設定ファイル

bash の場合、ホームディレクトリの ".bashrc" が設定ファイルとして起動時に読み込まれる。PATH の設定などはこの中に書いておく。

.bashrc を書き換えた後、設定を有効にするには、端末を再起動するか、つぎのようにする。

$ . ~/.bashrc

コマンド集

Linux の主要なコマンドを紹介する。以下では "file" はファイル、"dir" はディレクトリを意味している。

基本コマンド

ls

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

$ ls

引数なしだとカレントディレクトリのファイルを表示する。

$ ls dir

ディレクトリを指定すると、指定したディレクトリのファイルを表示する。

$ ls -l

オプション "-l" をつけると、ファイルのアクセス権や所有者、サイズなどを表示する。

$ ls -a

".bashrc" などの名前のはじめにピリオドが付くファイル ("ドットファイル" という) は、ls ではふつう表示されない。それらを表示するにはオプション "-a" を指定する。

cd

ディレクトリを移動する。

$ cd dir

ディレクトリを指定すると、そのディレクトリに移動する。

$ cd ..

上に戻るには ".." を指定する。

$ cd

引数なしだとホームディレクトリに移動する。

pwd

カレントディレクトリのパスを表示する。

$ pwd

mkdir

ディレクトリを作成する。

$ mkdir dir

rm

ファイルを削除する。

$ rm file1 file2

ファイルは複数指定できる。

$ rm -r dir

オプション "-r" をつけるとディレクトリを削除できる。

mv

ファイルを移動する。

$ mv file dir

file を dir に移動する。

$ mv file1 file2 dir

複数のファイルを指定して、最後がディレクトリだと、それ以前のファイルをそのディレクトリに移動する。

$ mv file1 file2

名前の変更もできる。

cp

ファイルをコピーする。

$ cp file1 file2

file1 を file2 としてコピーする。

$ cp file dir

file を dir 内にコピーする。

$ cp file1 file2 dir

複数のファイルを指定して、最後がディレクトリだと、それ以前のファイルをそのディレクトリにコピーする。

chmod

アクセス権を変更する。

"ls -l" でのアクセス権の確認のしかたを説明する。"ls -l" ではアクセス権は次のように表示される。

-rw-r--r--

アクセス権は 10 文字で表される。はじめの 1 文字はファイルなら "-"、ディレクトリなら "d"、リンクなら "l" となる。残りは 3 つずつ所有者、グループ、その他向けのアクセス権を意味する。3 つはそれぞれ読み取り "r"、書き込み "w"、実行 "x" となる。上の例では、所有者は読み取り・書き込み可能、グループのユーザーとその他は読み取りのみ可能ということを意味している。

chmod では、"u" で所有者、"g" でグループ、"o" でその他を表す。"+" で許可を与える、"-" で許可を与えないようにする。"r" で読み取り、"w" で書き込み、"x" で実行許可を指定する。

たとえば、所有者にのみ実行許可を与える場合、つぎのようにする。

$ chmod u+x file

所有者以外から読み取り許可を外すには、つぎのようにする。

$ chmod go-r file

すべてのユーザーに読み取り許可を与える場合、つぎのようにする。

$ chmod +r file

アクセス権を数字で指定することもできる。所有者、グループ、その他のアクセス権それぞれを数字 1 文字で表し、アクセス権を 3 桁の数字で表す。4 が読み取り、2 が書き込み、1 が実行を意味し、読み取り・書き込み許可は 4 + 2 = 6、読み取り・実行許可は 4 + 1 = 5、すべて許可は 4 + 2 + 1 = 7 になる。

たとえば、所有者に読み取り・書き込み許可、それ以外に読み取り許可を指定するにはつぎのようにする。

$ chmod 644 file

上の例に実行許可を加える場合は以下のようになる。

$ chmod 755 file

ln

リンクを作成する。

$ ln -s file1 file2

file1 を指す file2 というリンク (シンボリックリンク) を作る。リンクは、あたかもそれがリンク先のファイルであるかのように振る舞いる。上の例では、file2 にアクセスすると、file1 にアクセスするのと同じことになる。

less

ファイルの中身を表示する。

$ less file

操作キーはつぎのようになる。

j下へ移動
k上へ移動
f, Space大きく下へ移動
b大きく上へ移動
Gファイルの末尾へ移動
gファイルの先頭へ移動
/ (スラッシュ) の後に単語を入力単語を検索
n下へ検索
N上へ検索
q終了

grep

ファイル内から文字列を検索する。

$ grep -n error file

file から "error" という文字列を探する。"-n" は文字列を含む行の番号を表示させるオプションである。

$ grep -in error file

オプション "-i" をつけると、検索文字の大文字・小文字を区別しない。

$ grep -rin error .

オプション "-r" をつけると、ディレクトリ内すべてのファイルに対して文字列を検索する。

find

ファイルを探する。

$ find

引数なしだとカレントディレクトリ以下のファイルをすべて表示する。オプション "-name" でファイルを探すことができる。

$ fine -name file

アスタリスクも使える。

$ fine -name "test*"

tar

ファイルをまとめ、圧縮したり、展開したりする。

$ tar cvzf dir.tar.gz dir

ディレクトリをまとめ、gzip 圧縮する。"dir.tar.gz" は圧縮ファイル名で、任意である。

$ tar xvzf dir.tar.gz

圧縮ファイルを展開する。

bzip2 の場合は、オプション z の代わりに j を使う。

$ tar cvjf dir.tar.bz2 dir
$ tar xvjf dir.tar.bz2

圧縮ファイルの内容を知りたいだけであれば、オプション x の代りに t を使う。

$ tar tvzf dir.tar.gz

du

ファイルのサイズを表示する。

$ du -h file

file のサイズを表示する。オプション "-h" をつけると、わかりやすく単位をつけてくれる。

$ du -sh dir

ディレクトリのサイズを表示する。

man

コマンドのマニュアルを表示する。

$ man less

less コマンドのマニュアルを表示する。操作は less と同じである。

プロセス管理

jobs

実行中のジョブを表示する。

$ jobs

ジョブの番号が表示される。番号に "+" がついたものは "カレントジョブ" を表す。

bg

停止中のジョブをバックグラウンドで実行する。

$ bg %1

フォアグラウンドジョブが実行中に Ctrl+Z を入力すると、ジョブが停止する。bg はそのジョブをバックグラウンドで実行させる。引数の番号は jobs で表示されるジョブの番号である。引数なしだとカレントジョブに操作が適用される。

fg

実行中のバックグラウンドジョブ、あるいは停止中のジョブをフォアグラウンドで実行する。

$ fg %1

引数の番号は jobs で表示されるジョブの番号である。引数なしだとカレントジョブに操作が適用される。

nohup

シェルが終了してもコマンドが実行し続けるようにする。

$ nohup run &

コマンドをバックグラウンドで実行しても、シェルを終了する (端末を閉じる) と、コマンドは終了する。nohup は nohup 以下をコマンドとして、シェルのジョブではなくシステムのプロセスとして実行する。

ps

実行中のプロセスを表示する。

$ ps

引数なしだとシェルが実行中のプロセスを表示する。

$ ps u

自分が実行中のプロセスを他のシェルが実行中のものも含めて表示する。

$ ps ux

自分が実行中のプロセスをシェルに結びついていないものも含めて表示する。

$ ps aux

自分以外のユーザーのプロセスも含めて表示する。

kill

プロセスを停止する。

$ kill 1234

プロセス ID を指定してプロセスを停止する。プロセス ID は ps コマンドで取得できる。

$ kill %1

ジョブ番号で停止するプロセスを指定することもできる。

kill コマンドはプログラムに "シグナル" を送るプログラムである。シグナルの指定なしではシグナル "TERM" (terminate) を送るが、これは "終了する" というニュアンスである。これで止まらないプログラムもあり、その場合はつぎのようにシグナル "KILL" を送る。

$ kill -KILL 1234

こちらがほんとうの強制終了である。

システム情報

df

ファイルシステムの容量を表示する。

$ df -h

オプション "-h" でわかりやすく単位をつけてくれる。

free

メモリの容量を表示する。

$ free -m

オプション "-m" で MB 単位で表示する。

/proc/cpuinfo

コマンドではありないが、CPU 情報を取得できるファイルである (ほんとうのファイルではなく、ファイルのふりをしたもの)。

$ less /proc/cpuinfo

ifconfig

ネットワークインターフェイスの情報を表示する。

$ ifconfig

IP アドレスや MAC アドレスを取得できる。

システム管理

su

ユーザーを変更する。

$ su

引数なしだと root に変わろうとする。パスワードを聞かれる。システムによっては root になれないものもある (Ubuntu など)。

sudo

root としてコマンドを実行する。

$ sudo vi /etc/rc.local

sudo 以下を root のコマンドとして実行する。パスワードを聞かれる。sudo を使うには設定が必要である (はじめから使えるように設定されているシステムもある)。sudo でしか root のコマンドを実行できないシステムもある (Ubuntu など)。