M.Hiroi's Home Page

Linux Programming

お気楽 Linux 簡易コマンド集

[ Home | Linux ]

はじめに

最近の Linux はデスクトップ環境が充実しているので、Windows のように GUI (Graphical User Interface) でいろいろ操作することができますが、基本は端末 (Terminal) でキーボードからコマンドを入力する CUI (Character User Interface) でしょう。本ページでは基本的なコマンドについて簡単に紹介します。

CONTENTS


●コマンドの形式

コマンドはアプリケーションプログラムのことと考えてください。Windows の場合、アプリケーションを実行するにはアイコンをダブルクリックすればいいですね。ところが CUI の場合、ユーザはコンピュータに対する命令(コマンド)をキーボードから入力します。アプリケーションを実行する場合は、そのファイル名をキーボードから入力します。そして、ユーザーが入力した命令を処理するプログラムがシェル (shell) になります。

コマンドは次のような形式で入力します。

コマンド名 引数1 引数2 ... 

最初はコマンド名で、その後ろに引数が必要になる場合もあります。引数にはコマンドのオプションを指定するフラグがあります。Windows では「 / 」の後ろの 1 文字で表しますが、Unix 系の OS では「 - 」の後ろの 1 文字で表すか、「 -- 」の後ろの文字列で表す場合が多いようです。このほかにも引数でファイル名やディレクトリ名、あるいは特別なオプションを指定する場合もあります。これはコマンドによって異なります。

コマンド名や引数の間は空白で区切ります。そして最後にリターンキーを入力すると、シェルがこのコマンドを実行します。

●マニュアルの参照

コマンドの多くは、オプション --help を付けて実行すると簡単な使い方が表示されます。詳しい説明はコマンド man で参照することができます。

マニュアルが英語の場合、Ubuntu では次のコマンドで日本語のマニュアルをインストールすることができます。

sudo apt install manpages-ja

●ディレクトリ操作

「ディレクトリ (directory)」は Windows でいう「フォルダ」のことです。Unix 系 OS の場合、パスの区切り記号にはスラッシュ ( / ) を使います。また、Windows のようなドライブ番号(A:. B:, C:, D:, ...) はなく、すべてのサブディレクトリは一つの親ディレクトリからたどることができます。これを「ルートディレクトリ」といって / で表します。... は Windows と同じく、カレントディレクトリと一つ上の親ディレクトリを表します。

Unix の利用者 (ユーザ) は、登録されたときに自分専用のディレクトリが割り当てられます。これを「ホームディレクトリ」といいます。一般に、ホームディレクトリのパスは /home/ユーザ名 になります。たとえば、ユーザ名が mhiroi だとすると、/home/mhiroi がホームディレクトリで、チルダ ( ~ ) で表すことができます。

/  : ルートディレクトリ
~  : ホームディレクトリ
.  : カレントディレクトリ
.. : 一つ上の親ディレクトリ

●ファイル操作

Unix の場合、ファイル名は英大小文字を区別します。Foo と foo は異なるファイル名になります。

Unix 系 OS には、ファイルやディレクトリに別名を付けて、その名前でアクセスする機能があります。これを「リンク (link)」といいます。Windows でいえば、ファイルやディレクトリへのショートカットと同じような機能になります。リンクには次に示す二種類があります。

  1. ハードリンク
  2. シンボリックリンク

伝統的な Unix 系 OS のファイルシステムでは、ファイルやディレクトリを作成するとき、固有の番号を割り当てます。これを inode といいます。ファイルシステムは inode を使ってシステム内のデータを管理しています。たとえば、touch foo のようにファイルを作成すると、ファイルシステムから inode が割り当てられ、その inode に対して foo という名前が付けれらます。inode と名前の対応付けは OS が行ってくれます。

そして、inode に名前を付けることをハードリンクといいます。つまり、新しいファイルやディレクトリを作成するときハードリンクが行われているわけです。新規作成のときだけではなく、既存のファイル (inode) に異なる名前を付けることもできます。通常、これをハードリンクといい、コマンド ln を使って行います。なお、ln でリンクを設定することを「リンクをはる」と呼ぶことがあります。

ln src_name link_name

ln は引数の src_name が示す inode に対して、引数の link_name で指定した名前を付けます。これ以降、元のファイル名でも新しいリンク名でも、同じファイル (inode) にアクセスすることができます。

簡単な例を示しましょう。

$ echo hello, world > hello.txt
$ ls hello.txt
hello.txt
$ cat hello.txt
hello, world
$ ln hello.txt world.txt
$ ls -i hello.txt world.txt
157344511981279694 hello.txt  157344511981279694 world.txt
$ cat world.txt
hello, world

echo で hell, world を格納したテキストファイル hello.txt を作成します。つぎに、コマンド ln で hello.txt に world.txt というリンクを張ります。inode はコマンド ls のオプション -i で表示することができます。hello.txt と world.txt は同じ inode であることがわかります。

ハードリンクは通常のファイルと同様にコマンド rm で削除することができます。

$ rm world.txt
$ ls world.txt
ls: 'world.txt' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls hello.txt
hello.txt
$ cat hello.txt
hello, world
$ rm hello.txt
$ ls hello.txt
ls: 'hello.txt' にアクセスできません: そのようなファイルやディレクトリはありません

rm world.txt で world.txt を削除しても、ファイル名 hello.txt やデータ本体は残っています。inode はハードリンクの個数を保持していて、それが 0 にならない限りデータ本体は削除されません。また、コマンド mv でファイル名を変更したり hello.txt を他のディレクトリへ移動しても、データ本体である inode の値は変わらないので、world.txt でファイルにアクセスすることができます。なお、ln でディレクトリにハードリンクをはることはできません。ご注意くださいませ。

2 のシンボリックリンクは inode にリンクをはるのではなく、ファイル名やディレクトリ名にリンクをはる方法です。コマンド ln でオプション -s を指定します。

ln -s src_name link_name

src_name がファイル名であれば、link_name を使って src_name が示すファイルにアクセスすることができます。この場合、inode のハードリンクの個数は増加しません。src_name がディレクトリであれば、ディレクトリの操作に link_name を使うことができます。たとえば、cd link_name とすればディレクトリ src_name に移動することができます。

簡単な例を示しましょう。

$ echo hello, world > hello.txt
$ ls hello.txt
hello.txt
$ ln -s hello.txt world.txt
$ ls world.txt
world.txt
$ ls -il hello.txt world.txt
389561367767553138 -rw-r--r-- 1 mhiroi mhiroi 13 ...略... hello.txt
429812289437176961 lrwxrwxrwx 1 mhiroi mhiroi  9 ...略... world.txt -> hello.txt
$ cat world.txt
hello, world
$ cat hello.txt
hello, world

ln -s でリンクを張って world.txt の inode とパーミッションを ls -il で確認します。inode は hello.txt と異なっていて、パーミッションの先頭文字が l (リンク) になっています。ファイル名のところを見ると hello.txt へリンクが張られていることがわかります。そして、cat でファイルの内容を表示すると、どちらも hello, world と表示されます。

ハードリンクとは異なり、シンボリックリンクは元のファイル名を削除したり変更したりするとデッドリンクになります。

$ rm hello.txt
$ ls hello.txt
ls: 'hello.txt' にアクセスできません: そのようなファイルやディレクトリはありません
$ ls -l world.txt
lrwxrwxrwx 1 mhiroi mhiroi 9 ...略... world.txt -> hello.txt
$ cat world.txt
cat: world.txt: そのようなファイルやディレクトリはありません

このように、hello.txt を削除してもシンボリックリンクは残っていますが、ファイル名 hello.txt がないので world.txt でファイルにアクセスすることはできません。

シンボリックリンクを削除するにはコマンド unlink を使います。

unlink link_name
$ unlink world.txt
$ ls world.txt
ls: 'world.txt' にアクセスできません: そのようなファイルやディレクトリはありません

●テキスト処理

●ユーザとグループ

●パーミッション

Linux のファイルやディレクトリには「パーミッション (permission)」というアクセス権が設定されています。簡単な例を示します。

mhiroi@mhiroi-VirtualBox:~/test$ ls -l
合計 16
-rwxrwxr-x 1 mhiroi mhiroi 7328 11月 24 14:53 a.out
-rw-rw-r-- 1 mhiroi mhiroi   77 11月 24 14:52 hello.c
drwxrwxr-x 2 mhiroi mhiroi 4096 12月 17 11:33 work

d r w x r w x r w x
  --A-- --B-- --C--

A : 所有者の権限
B : グループの権限
C : その他の権限

d : ディレクトリ
l : シンボリックリンク
- : 通常ファイル
  :  ファイル  : ディレクトリ
--+------------+--------------------------------------------
r : 読み込み可 : 一覧表示が許可される
w : 書き込み可 : ファイルの削除や名前の変更などが許可される
x : 実行可     : ディレクトリにアクセス可
- : 不許可     : 不許可

hello.c は所有者とグループの人は読み書きできますが、他人は読むことしかできません。a.out は実行ファイルで、所有者やグループだけではなく、他人も実行することができます。ディレクトリ (work) の場合、簡単に言えば r があると ls work が許可されて、x があると cd work が許可されます。

●プロセスとジョブ

コマンドの実行は OS (カーネル) によって管理されます。この処理単位を「プロセス (process)」といいます。通常、ひとつのコマンドがひとつのプロセスに対応します。プロセスはプロセス識別子 (PID) という番号が割り当てられていて、PID でプロセスを指定することができます。シェルは一つ以上のコマンドを組み合わて実行することができます。この処理単位を「ジョブ (job)」といいます。プロセスはカーネルが管理しますが、ジョブはシェルが管理します。ジョブも「ジョブ番号」が割り当てられていて、これでジョブを指定することができます。

Windows や Unix 系の OS は、複数のアプリケーション (コマンド) を同時に実行することができます。シェルでコマンドを実行すると、そのコマンドが終了するまでシェルは待機します。いま実行しているプロセス (ジョブ) のことを「フォアグランドプロセス (ジョブ)」といいます。これに対し、コマンドの後ろに & を付けて実行すると、コマンドの終了を待たずに、シェルのプロンプトが表示されて、あたらなコマンドを入力することができます。このとき、実行しているプロセス (ジョブ) のことを「バックグランドプロセス (ジョブ)」といいます。

フォアグランドプロセスは Ctrl-Z を入力すると、一時停止してバックグランドに移り、シェルのプロンプトが表示されます。

●ファイルの圧縮と展開

Unix 系の OS では、複数のファイルを tar (テープアーカイバ) で一つのファイルにまとめ、それを圧縮ツール gzip で圧縮することが一般的でした。最近では、gzip のかわりに bzip2 や xz (XZ Utils) を使うことが多くなってきたようです。xz(ファイルフォーマット) - Wikipedia によると、『xz はLZMA2圧縮アルゴリズムを利用する可逆圧縮ファイルフォーマット』 とのことです。

Lubuntu の場合、File Roller というファイルアーカイバが同梱されていて、多くのファイル形式に対応しています。ファイルマネージャ (PCManFM) で書庫ファイルを指定して展開する、逆に複数のファイルを指定して書庫ファイルにまとめるなど、書庫ファイルの作成や展開を簡単に行うことができます。

もちろん、端末から操作することもできます。最近の GNU tar であれば、オプションで gzip, bzip2, xz などファイル形式を指定できるので、tar だけで書庫ファイルの作成や展開を行うことができます。

●シェル (bash), コマンド操作

●ネットワーク

●その他


初版 2015 年 1 月 25 日
改訂 2022 年 1 月 15 日

Copyright (C) 2015-2022 Makoto Hiroi
All rights reserved.

[ Home | Linux ]