Linux 入門

2013年8月14日
春日 悠

はじめに

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

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 など)。