第17章 シェルの基礎

目次

17.1. シェルの起動
17.2. コマンドの入力
17.3. ファイルとディレクトリを利用する作業
17.4. root への移行
17.5. ファイルのパーミッション
17.6. シェルの便利な機能
17.7. テキストの編集
17.8. ファイル名やファイル内容の検索
17.9. テキストファイルの表示
17.10. リダイレクトとパイプ
17.11. プログラムの起動とプロセスの処理
17.12. 重要な Linux コマンド

今は Linux で作業を行なう場合であっても、コマンドラインインタプリタ (いわゆるシェル) を利用することなくシステムを操作することができるように なりました。 Linux システムを起動するとすぐにログイン処理を行なうための グラフィカルユーザインターフェイスが表示され、あとはグラフィカルな表示 のままオペレーティングシステムを使うことができるようになっています。 Linux でのグラフィカルなユーザインターフェイス (X ウインドウシステムや X11 と呼ばれます) はインストール時に設定しますので、ユーザからは KDE や GNOME のデスクトップ (またはインストールを行なった他のウインドウ マネージャ) だけを使用するようになっています。

しかしながら、シェルで作業を行なうにあたっての基礎知識は備えておいたほうが よいでしょう。これは、グラフィカルなユーザインターフェイスが利用できない 事態が発生しうるためです。たとえば X ウインドウシステムに何らかの問題が 発生した場合などが該当します。また、シェルに慣れていない方にとっては コマンドの入力が面倒だと感じることもありますが、慣れてくると日々の作業を 行なう際に、コマンドラインのほうが素早く簡単であることもしばしば発生する でしょう。

UNIX や Linux 向けにシェルには複数の種類があり、それぞれ少しずつ動きの 違いや受け入れるコマンドの違いがあります。 openSUSE® での既定の シェルは bash (GNU Bourne-Again Shell) です。

下記の章では、 bash シェルを使い始めるにあたっての基本ステップの紹介と、 コマンドラインでの基本作業のやりかたについて、いくつかを紹介したいと 思います。さらに知識を深めたい場合や、既にシェルについてそれなりの知識 をお持ちの パワーユーザ の場合は、 第18章 Bash と Bash スクリプト をお読みください。

17.1. シェルの起動

お使いのコンピュータを起動し、表示されたグラフィカルユーザインターフェイスから シェルを起動するには、基本的に 2 つの方法があります:

  • グラフィカルユーザインターフェイスを終了させるか、もしくは

  • グラフィカルユーザインターフェイスの 内側に 端末ウインドウを表示させる方法

1 つめの選択肢はいつでも実施できますが、 2 つめの選択肢は KDE や GNOME などのデスクトップに、既にログインしている場合にのみ選ぶことが できます。なお、どちらの場合であっても、シェルとグラフィカルユーザ インターフェイスの間を行き来することができます。

シェルを試してみたいときは、 Ctrl+Alt+F2 を押してグラフィカル ユーザインターフェイスを抜けてください。グラフィカルな画面が消え、代わりに ログインを促すプロンプトが表示されます。まずはユーザ名を "login:" の欄に入力し、 Enter を押してください。その後、 "Password:" と表示されたら、パスワードを入力して Enter を押してください。正しくユーザ名とパスワード を入力すると、プロンプトが変化して下記のような便利な情報を表示します:

 1   2   3
tux@linux:~>

1

ログイン名を表示しています。

2

お使いのコンピュータのホスト名を表示しています。

3

現在位置しているディレクトリのパスを表示しています。ログイン直後は お使いのユーザのホームディレクトリに位置しているため、 ~ (チルダ) のシンボルで表示されます。

たとえばリモートのコンピュータからログインしているような場合、プロンプト で表示される情報を読むことで、作業中のシステムがどれであるのかを判別 できるようになっています。

カーソルがこのプロンプトの後ろに表示されていれば、それはお使いの コンピュータにコマンドを直接入力することができる印です。たとえば、 現在位置しているディレクトリにある全てのコンテンツを詳しく一覧 表示するには、 ls -l と入力 します。なお、シェルでの作業を終わらせてグラフィカルなユーザ インターフェイスに戻したい場合は、まずはそのシェルを終了させなければ なりません。 exit と入力し、 Enter を押してください。その後、 Alt+F7 を押すと、グラフィカルなユーザ インターフェイスに戻すことができます。先ほどまで使用していた デスクトップとアプリケーションが元通りに表示されているはずです。

既に GNOME や KDE デスクトップにログインしていて、そのデスクトップ 内に端末ウインドウを表示させたい場合は、 Alt+F2 を押し、 KDE の場合は konsole 、 GNOME の場合は gnome-terminal と入力してください。すると お使いのデスクトップ内に端末ウインドウを表示させることができます。 既にデスクトップにログインしている状態なので、そのまま上記で 説明したプロンプトが表示されている はずです。ここからコマンドを入力し、シェル内での作業をデスクトップ と並行して行なうことができます。他のアプリケーションに切り替える には単にアプリケーションのウインドウをマウスで選択するか、もしくは タスクバーからアプリケーションを選択してください。なお、端末 ウインドウを閉じるには、 Alt+F4 を押します。

17.2. コマンドの入力

シェル内にプロンプトが表示されれば、そこからすぐにでもコマンドを 受け付けて実行することができます。コマンドには複数の要素が含まれます。 まず 1 つめとして実際のコマンドが、それ以降にはいくつかのパラメータや オプションをそれぞれ指定します。また、 , , Home, End, <— (バックスペース), Del, Space の各キーを利用して、入力しているコマンドを 編集することもできます。入力ミスの訂正や、オプションの追加などは これらをご利用ください。コマンドは Enter を押す までは実行されません。

[Important]便りのないのはよい知らせ

シェルは冗長な出力を行ないません: いくつかのグラフィカルなユーザ インターフェイスとは異なり、コマンドを実行する前や後に確認メッセージを 表示したりすることはありません。メッセージは何か問題が発生したときや、 何らかのエラーが発生した場合にのみ表示されるほか、コマンドを実行する 際に明示的にオプションで指定した場合にのみ表示されます。

また、何かを削除するコマンドの場合にもご注意ください。 rm (オプション指定無し) のようなコマンドを入力してファイルを削除する前に、 本当に削除してかまわないのかどうかをよくお確かめください: 実行してしまうと確認無しにファイルを消してしまい、取り返しが付かなく なってしまいます。

17.2.1. オプション指定無しでのコマンド実行

既に 17.5.1項 「ユーザ、グループ、その他のユーザに対するパーミッション」 で最も基本的な ls コマンドについて学習しました。 これはディレクトリの内容を表示するためのコマンドです。 このコマンドはオプションを指定して実行することもできます。 ls コマンドに何もオプションを指定しないと、 現在位置しているディレクトリの内容を表示します:

tux@knox:~> ls
bin Desktop Documents public_html tux.txt
tux@knox:~>

Linux 内のファイルには .txt のような拡張子や接尾辞と 呼ばれるものが設定されているものがありますが、必ずしも必要なものでは ありません。そのため、 ls の出力ではファイルと ディレクトリを区別するのが難しくなってしまっています。ただし、 既定の bash シェルではそれらを区別するためのヒントがあります: 通常、ディレクトリは青色でファイルは黒色で表示されます。

17.2.2. オプション指定を行なうコマンド実行

ディレクトリ内のコンテンツについて、より詳しく知る方法としては ls コマンドにオプション文字列を追加する方法があります。 オプションはコマンドの動作を変えるためのもので、目的の作業をより 便利に行なうための機能です。コマンド内でのオプションは、スペースで 区切って指定し、普通はハイフンから始まる文字列で指定します。 たとえば ls -l のように入力すると、 同じディレクトリをより詳しく表示させる (長い出力形式) ことができます:

tux@knox:~> ls -l
drwxr-xr-x 1 tux users     48 2006-06-23 16:08 bin
drwx---r-- 1 tux users  53279 2006-06-21 13:16 Desktop
drwx------ 1 tux users    280 2006-06-23 16:08 Documents
drwxr-xr-x 1 tux users  70733 2006-06-21 09:35 public_html
-rw-r--r-- 1 tux users  47896 2006-06-21 09:46 tux.txt
tux@knox:~>

それぞれの項目の意味は下記のとおりです:

drwxr-xr-x1 12 tux3 users4 485 2006-06-23 16:086 bin7 

1

ファイルやディレクトリなどの種類や、パーミッションを示しています。 詳しくは 17.5.1項 「ユーザ、グループ、その他のユーザに対するパーミッション」 をご覧ください。

2

このファイルに対するハードリンク数を示しています。

3

ファイルやディレクトリの所有者を示しています。詳しくは 17.5.1項 「ユーザ、グループ、その他のユーザに対するパーミッション」 をご覧ください。

4

ファイルやディレクトリに割り当てられたグループを示しています。 詳しくは 17.5.1項 「ユーザ、グループ、その他のユーザに対するパーミッション」 をご覧ください。

5

バイト単位でのファイルサイズを示しています。

6

最終更新日時を示しています。

7

ファイルやディレクトリの名前を示しています。

一般に、オプションを複数個指定する際は最初の 1 つにだけハイフンを付け、 あとは空白を入れずに並べてください。たとえば、全てのファイルを長い出力 形式で表示したい場合は、 -l-a (全てのファイルを表示するオプション) を組み合わせ、 ls -la のように実行すると、 ドットで始まるようなディレクトリ内の隠しファイル (たとえば .hiddenfile のようなファイル) なども表示される ようになります。

また、 ls での出力はファイル名をアルファベット順に 並べ替えた形で表示します。しかし、グラフィカルなファイルマネージャの ように、 ls -l の出力を日付順や 拡張子順、ファイルサイズ順などの様々な条件で並べ替えることができます:

  • 日時順に並べるには、 ls -lt (新しいものを先に表示します) と入力します。

  • 拡張子順に並べるには、 ls -lx (拡張子のないものが先に表示されます) と入力します。

  • ファイルサイズ順に並べるには、 ls -lS (大きいものから順に表示します) と入力します。

並べる順序を逆にするには、さらに -r オプションを ls コマンドに追加してください。たとえば ls -lr のようなコマンドの場合は、 逆アルファベット順に表示します。また、 ls -ltr では古いファイルを先に 表示します。下記の章では、これらオプションの調査方法について 述べています。

17.2.3. ヘルプ表示

全てのコマンドに関する全オプションを記憶している人なんて、どこにも いません。コマンド名がわかっているのにオプションを忘れてしまったり、 オプションの書き方を忘れてしまったりしたような場合は、下記のような 方法で見つけ出すことができます:

--help オプション

特定のコマンドに対してオプションの一覧だけを表示させたい場合は、 コマンドを入力した後にスペースを入れ、続けて --help と入力し実行してください。この --help オプションは 多くのコマンドで利用することができます。たとえば ls --help は、 ls コマンドで利用する全てのオプションを表示 します。

マニュアルページ

様々なコマンドについて学ぶには、マニュアルページを利用することも できます。マニュアルページには、そのコマンドが何をするためのもの なのかを簡潔に説明しています。マニュアルページを参照するには、 man に続けてコマンドを入力してください。 たとえば man ls のように入力します。

マニュアルページはシェル内に直接表示されます。 Page ↑Page ↓ を利用してそれぞれ上や下に移動 させてください。なお、マニュアルページの冒頭に飛ぶには Home を、末尾まで飛ばすには End をそれぞれ押してください。閲覧を終了する には、 Q を押します。 man コマンド自身についてさらに詳しく知るには、 man man と入力してください。

info ページ

info ページには、一般にコマンドに関するさらに詳しい情報が掲載されます。 特定のコマンドに対する info ページを閲覧するには、 info に続いてコマンドの名前を入力してください (たとえば info ls) 。このコマンドを実行すると、シェル内に 直接 info ページが表示され、 ノード と呼ばれる 複数のセクションが表示されます。先に進むには Space を、 前に戻るには <— をそれぞれ押してください。 ノード内では Page ↑Page ↓ を利用することもできますが、 Space<— は前や後ろのノードに移動することが できる点が異なります。なお、マニュアルページの閲覧と同様に、 Q を押すと閲覧モードを終了することができます。

なおマニュアルページと info ページは、全てのコマンドで用意されている わけではありません。コマンドによっては両方とも用意されている場合も あります (主要なコマンドではこの形態です) し、コマンドによっては マニュアルページか info ページのいずれかしか用意されていない場合も あります。また、両方とも利用できないものもあります。

17.2.4. bash ショートカットキー

いくつかのコマンド入力を行なったら、お使いのシェルからはこれらの コマンドや関連する出力の補完機能を利用することができます。下記の 表には、シェルから利用できる閲覧/編集機能に関するショートカット キーの一覧を表示しています。

ショートカットキー

機能

Ctrl+L

画面を消去し、現在の行を画面の冒頭に移動させます。

Ctrl+C

現在実行中のコマンドを中断します。

Shift+Page ↑

上にスクロールします。

Shift+Page ↓

下にスクロールします。

Ctrl+U

現在のカーソル位置よりも前にある文字を削除します。

Ctrl+K

現在のカーソル位置以降の文字を削除します。

Ctrl+D

シェルのセッションを終了します。

,

過去に実行したコマンドの履歴を閲覧します。

17.3. ファイルとディレクトリを利用する作業

ある特定のファイルやディレクトリを指定するには、そのディレクトリやファイル を指定するためのパスを入力します。既に MS-DOS や Mac OS の知識から おわかりのように、パスを指定するための方法が 2 種類存在しています:

絶対パス

ルートディレクトリから、特定のファイルやディレクトリに至るまでの 全てのパスを表記する方法です。

相対パス

現在位置するディレクトリ (カレントディレクトリ) を開始点として、 そこからの相対的なパスを表記する方法です。相対的な表記には、 カレントディレクトリから目的のファイルやディレクトリに至る までの、ファイルシステムのツリー構造におけるディレクトリ移動 (上位のディレクトリや下位のディレクトリ) を含みます。

パスはファイル名またはディレクトリ、もしくはその両方が含まれ、 それぞれの要素はスラッシュで区切ります。絶対パスは常にスラッシュから 始まる書式です。相対パスはスラッシュから始まらない表記で、場合に よっては 1 つまたは 2 つのドットから始まる場合があります。

コマンドを入力する際は絶対パスで指定しても相対パスで指定しても かまいません。どちらか使いやすいほうや、入力量の少ない方を 選んでください。どちらであっても同じ結果になります。カレント ディレクトリを変更するには、 cd コマンドを 利用して移動先のディレクトリを指定します。

[Note]ファイル名とディレクトリ名における空白の処理

ファイル名やディレクトリ名に空白 (半角スペース) が含まれている場合、 バックスラッシュ (日本語フォントでは円マーク \ として表示されます) を前に置いてエスケープ処理を行なうか、もしくは ファイル名全体をシングルクオート (') で括って ください。そうでないと、 bash は My Documents のようなファイル名を 2 つのファイルやディレクトリとして認識して しまいます。この場合は MyDocuments として認識されます。

パスを指定する際には、下記の ショートカット を利用すると 入力量を減らすことができます:

  • チルダ (~) の文字は、ホームディレクトリのショート カットとして利用することができます。たとえばホームディレクトリの内容 を一覧表示したい場合は、 ls ~ と入力してください。他のユーザのホームディレクトリについて一覧を表示したい 場合は、 ls ~ユーザ名 と入力してください (もちろん、そのディレクトリにアクセスするための 権利がある場合にのみ表示可能です。詳しくは 17.5.1項 「ユーザ、グループ、その他のユーザに対するパーミッション」 をお読みください) 。たとえば ls ~tux と入力すると、 tux というユーザの ホームディレクトリの内容について一覧表示を行ないます。 ホームディレクトリのショートカットは、ネットワーク環境で作業を 行なっている場合でも利用することができます。ネットワーク環境の場合、 /home ではない別のディレクトリがホーム ディレクトリのベースになっている場合があることにご注意ください。

    また、ファイルシステム上のどのディレクトリに位置していても、 cd ~ または単に cd と入力すると、ホームディレクトリに移動することが できます。

  • 相対パスで指定を行なう際、カレントディレクトリはドット 1 つ (.) で代用できます。これに主に cpmv のコマンドで便利な機能で、コピーや移動に際して コピー (または移動) 元やコピー (または移動) 先にカレントディレクトリを 指定することができます。

  • ファイルシステムの構造内で上位のディレクトリを表わす場合には、ドット 2 つ (..) で代用することができます。たとえばカレント ディレクトリを現在の親にあたるディレクトリに移動するには、 cd .. と入力してください。親の親に移動する場合は、 cd ../.. と入力します。

知識をより確かなものにするため、下記にいくつかの例を示します。 これらは、 bash を利用してファイルやディレクトリに対する処理を行なう、 基本作業を示しています。

17.3.1. ファイルとディレクトリを利用する作業の例

下記の例では、ホームディレクトリのどこかにファイルが存在していて、 /tmp 以下にサブディレクトリを作成してから、 そのディレクトリにファイルをコピーする場合の例です。

手順17.1 ディレクトリの作成と変更

ホームディレクトリに位置している状態で、 /tmp 以下にサブディレクトリを作成するには、下記のようなコマンドラインを 実行します:

  1. Enter

    mkdir  /tmp/test

    mkdir とは make directory (ディレクトリの 作成) という意味です。このコマンドは新しく test という名前のディレクトリを /tmp ディレクトリ以下に 作成するものです。この例では、 test ディレクトリを 作成するのに絶対パスを利用して指定しています。

  2. どのようになったのかを調べるには、下記のように入力します:

    ls -l /tmp

    /tmp ディレクトリの内容一覧に test が現われるようになり、ディレクトリが 作成できたことを示しています。

  3. 新しく作成したディレクトリに移動するには、下記のように入力します:

    cd /tmp/test

手順17.2 ファイルの作成とコピー

次にホームディレクトリ内にサブディレクトリを作成し、そのディレクトリに 新しいファイルを作成してから、 /tmp/test に そのファイルをコピーします。この作業では、相対パスを利用します。

[Important]既存のファイルへの上書き

コピーや移動、ファイル名の変更を行なう前に、既に宛先のディレクトリ内に 同じ名前のファイルが存在していないことを確認してください。同じファイル 名が存在している場合は、 cpmv コマンドに -i を付けることをご検討ください。 これにより既存のファイルを上書きしてしまうような場合に、問い合わせ メッセージを表示するようになります。このオプションを指定しないと、 bash は確認無しでファイルを上書きしてしまいます。

  1. ホームディレクトリの内容を一覧表示するには、下記のように入力します:

    ls -l ~

    既定では Documents というディレクトリは作成されて いませんので、 mkdir コマンドを利用して 下記のように入力してディレクトリを作成します:

    mkdir ~/Documents
  2. ここから、中に何も書かれていない新しいファイル myfile.txtDocuments ディレクトリ以下に作成します:

    touch ~/Documents/myfile.txt

    通常、 touch コマンドは既存のファイルのアクセス日時を 更新するために使用しますが、 touch コマンドを存在しない ファイルに対して実行すると、新しいファイルが作成されます。

  3. ファイルを作成したら、下記のように入力すると、作成したファイルが 見えるようになります:

    ls -l ~/Documents

     

  4. 新しく作成したファイルをコピーするには、下記のように入力します:

    cp ~/Documents/myfile.txt .

    なお、行末にあるドットを忘れずに入力してください。

    このコマンドは、 bash に対してホームディレクトリ以下の Documents サブディレクトリ内にある myfile.txt ファイルを、ファイル名を変更する ことなくカレントディレクトリにコピーすることを意味します。

  5. コピー結果を見るには、下記のように入力します:

    ls -l

    /tmp/test ディレクトリ内に myfile.txt が現われるようになっているはずです。

手順17.3 ファイルやディレクトリの名前変更と削除

ここからさらに、 myfile.txt のファイル名を tuxfile.txt に変更します。最後にファイル名を 変更したファイルと、 test サブディレクトリを 削除します。

  1. ファイル名を変更するには、下記のように入力します:

    mv myfile.txt tuxfile.txt
  2. 結果を見るには、下記のように入力します:

    ls -l

    一覧には myfile.txt の代わりに tuxfile.txt が表示されるようになっている はずです。

    mv コマンドは move (移動) という意味で、 2 つのオプションを指定します: 1 つめは移動元を、 2 つめは移動先をそれぞれ指定します。また、 mv コマンドは下記の用途に利用することができます:

    • ファイル名の変更やディレクトリ名を変更する

    • ファイルやディレクトリを新しい場所に移動する

    • 上記の両方をいっぺんに行なう

  3. さて、ファイルを必要のないものであると判断した場合は、 下記のように入力して削除を行なうことができます:

    rm tuxfile.txt 

    これにより、 bash は確認メッセージを表示することなくファイルを削除します。

  4. さらにここから cd .. を入力して上位のディレクトリに 移動し、下記を入力して一覧を表示します:

    ls -l test

    ファイルを削除したため、 test の中身は 空になっているはずです。

  5. 中身が空であることを確認したら、最後に以下を入力して test ディレクトリを削除します:

    rmdir test

17.4. root への移行

root はスーパーユーザとも呼ばれ、このユーザにはシステムのすべての 箇所にアクセスし、管理作業を実行するための権利が割り当てられています。 root はシステムに対して制限無く設定を変更することができるほか、 すべてのファイルに対して制限無くアクセスすることができます。そのため、 YaST のように root の権利が必要な管理作業や、特定のプログラム 実行にのみ使用すべきです。

17.4.1. su の使用

シェル内で一時的に root になるには、下記のようにして行ないます:

  1. su コマンドを実行します。すると root の パスワードを尋ねられます。

  2. パスワードを尋ねられたら、パスワードを入力します。 root のパスワードの入力を間違えると、その旨のメッセージが表示 されます。この場合、再度 su コマンドを入力して やり直してください。パスワードを正しく入力すると、 プロンプトの最後にハッシュシンボル # が表示 されるようになります。これは root で作業を行なっていることを 示す印です。

  3. 必要な作業を実行します。たとえば、あるファイルの所有権を新しいユーザ に移行するには root の権限が必要ですが、下記のように行ないます:

    chown wilber kde_quick.xml
  4. root での作業が終わったら、通常のユーザアカウントに戻ります。 下記のように入力してください:

    exit

    ハッシュシンボルの表示が消えますので、 通常の ユーザと しての作業に戻ったことを表わします。

17.4.2. sudo の使用

前項以外にも、 sudo コマンド (superuser do; スーパーユーザで何かを 行なう の 意味です) を利用して、 root でのみ実行可能な作業を行なうことが できます。 sudo では、あらかじめ管理者側で root の権限を許す ユーザとコマンドを指定しておく必要があります。設定にもよりますが、 通常の設定であれば root でのコマンド実行を自分自身の (ユーザの) パスワードを入力して行ないます。またタイムスタンプ機能により、 ユーザはパスワードを入力してから一定の時間だけ有効な チケット を入手することになります。チケットは数分程度で効果が失われます。 なお openSUSE においては、既定では root のパスワードを 要求します (システム管理者で別途設定した場合を除きます) 。

ユーザに対しては、 sudo はユーザを切り替えて戻すための手間を省く便利な ツールになっています。たとえば sudo を利用したファイルの所有権を変更する には、下記の 1 つのコマンドでいっぺんに行なうことができます:

sudo chown wilber kde_quick.xml

必要なパスワードを入力するとコマンドが実行されます。 root でコマンド を実行してからそれほど時間が経過していなければ、パスワードを再度 尋ねられることはありません。これはチケットと呼ばれる機能が有効に 働いているためです。一定の時間が経過するとチケットは自動的に無効化 され、パスワードが再度要求されるようになります。これにより、 ユーザが root の権限を利用して作業を行なったあと、シェルを 閉じるのを忘れ、 root の権限を許可しないユーザにまで 開放してしまったりすることを防ぐことができます。

17.5. ファイルのパーミッション

Linux では一般に、ファイルやディレクトリ、プロセスなどのオブジェクトは、 作成したり起動したりしたユーザに属します。ただしこれにはいくつかの例外 があります。例外について、詳しくは 第10章 Linux におけるアクセス制御リスト (↑セキュリティガイド) をお読みください。また、ファイルやディレクトリに設定されるグループは、 オブジェクトを作成したときに設定されていた、ユーザのプライマリグループの 値が反映されます。

新しいファイルやディレクトリを作成すると、事前に設定された方針に沿って それらに対する初期状態のパーミッションが設定されます。ファイルや ディレクトリの所有者であれば、これらに対するパーミッションを変更する ことができます。たとえば機密データに対して他のユーザからの読み込みを 禁止したり、グループ内のメンバーに対してアクセスを許したり、他のユーザ に対しても書き込みや読み込み、実行までも許可したりすることができます。 なお、 root からはファイルやディレクトリの所有者を変更することが できます。

17.5.1. ユーザ、グループ、その他のユーザに対するパーミッション

Linux システムでは、各ファイルに対して 3 種類のパーミッションを設定する ことができます。それぞれ所有者、グループ、その他のユーザに対する パーミッションで、その中にはそれぞれ読み込み、書き込み、実行の各許可を 設定することができます。

下記はシェルから ls -l コマンドを 実行した場合の例です。このコマンドはディレクトリ内にあるファイルや サブディレクトリの一覧を表示するためのコマンドで、各ファイルや ディレクトリの詳細な情報を出力します。

例17.1 ファイルやディレクトリに対するパーミッション

-rw-r----- 1 tux users      0 2006-06-23 16:08 checklist.txt
-rw-r--r-- 1 tux users  53279 2006-06-21 13:16 gnome_quick.xml
-rw-rw---- 1 tux users      0 2006-06-23 16:08 index.htm
-rw-r--r-- 1 tux users  70733 2006-06-21 09:35 kde-start.xml
-rw-r--r-- 1 tux users  47896 2006-06-21 09:46 kde_quick.xml
drwxr-xr-x 2 tux users     48 2006-06-23 16:09 local
-rwxr--r-- 1 tux users 624398 2006-06-23 15:43 tux.sh

左から 3 つめの列には、それぞれのファイルやディレクトリが tux ユーザに属しているもの であることが示されています。これらは tux ユーザのプライマリグループである users のグループ に割り当てられています。また、一番左の列にはパーミッションの情報が表示 されています。たとえば kde-start.xml の場合、 下記のような意味になっています:

種類

所有者自身に対するパーミッション

グループに対するパーミッション

その他のユーザに対するパーミッション

-

rw-

r--

r--

一番左の列には、 1 文字目にファイルの種類が書かれていて、残りの 9 文字は それぞれ 3 文字ずつのブロックになっています。この場合、ファイルの種類には ハイフン () が表示されていて、通常のファイルで あることがわかります。ここに d が書かれていれば、それは ディレクトリであることを示しています。たとえば、 例17.1「ファイルやディレクトリに対するパーミッション」 の例では local がそれに該当します。

次に続く 3 つのブロックは、それぞれ所有者、グループ、その他のユーザに 対するパーミッション設定を表わします (左から右に読みます) 。それぞれの ブロックは同じパターンになっていて、 1 文字目が読み込み許可 (r), 2 文字目が書き込み許可 (w), 最後が実行許可 (x) になっています。許可が与えられていない ものについては - が表示されます。この例では、 kde-start.xml の所有者はそのファイルを読み込んで 書き込むことができるが、実行することはできません。 users グループに属しているユーザからは読み込むことだけができて、書き込みや 実行はできません。その他のユーザについても読み込みだけができるような 設定になっています。

17.5.2. ファイルとディレクトリ

パーミッションは、その適用先 (ファイルやディレクトリ) によって、若干意味の 違いがあります。下記にはそれぞれの違いを示しています:

表17.1 ファイルとディレクトリに対するパーミッション

パーミッション

ファイルの場合

ディレクトリの場合

読み込み (r)

対象のユーザはファイルを開いて読み込むことができます。

対象のユーザはそのディレクトリの内容を閲覧することができます。 この許可がないと、ユーザは ls -l コマンドなどでディレクトリ内の一覧を見ることができなくなります。 しかしながら、そのディレクトリに対して実行許可だけが存在した 場合は、ファイル名を直接指定して (もちろんそのユーザがファイルの 存在を知っていれば) アクセスすることはできます。

書き込み (w)

対象のユーザはファイルを変更することができます。データを書き加えたり 一部を取り除いたりすることができるほか、中身の削除を行なうことも できます。しかしながら、この書き込み権限はファイルそのものの削除には 対応していません。そのファイルが存在するディレクトリに対して書き込み 権限を持っていないと、そのディレクトリからのファイル削除を行なう ことができません。

対象のユーザは、そのディレクトリ内にファイルを作成したり、ファイル名 を変更したり、削除したりすることができます。

実行 (x)

対象のユーザは該当のファイルを実行することができます。この許可は プログラムやシェルスクリプトに対して設定するもので、テキストファイル などに設定しても意味はありません。オペレーティングシステムから、 そのファイルを直接実行できるような種類のものであれば、そのファイルを 実行するのに読み込み権限は不要です。しかしながら、シェルスクリプトや Perl のプログラムのように、ファイルの中身を読んで解釈する必要のある ファイルの場合は、読み込み権限が必要です。

対象のユーザはそのディレクトリに移動し、そこでファイルを実行すること ができます。そのディレクトリに対して読み込み権限がない場合は、ファイル の一覧を表示することはできませんが、ファイルの存在を知っていれば それらに直接アクセスすることができます。


なお、特定のファイルに対するアクセスは、ファイル自身に対する適切なパーミッション に 加え 、そのファイルが存在するディレクトリに対しても 適切なパーミッションを設定しておく必要があります。

17.5.3. ファイルのパーミッション修正

Linux では一般に、ファイルやディレクトリ、プロセスなどのオブジェクトは、 作成したり起動したりしたユーザに属します。また、ファイルやディレクトリに 設定されるグループは、オブジェクトを作成したときに設定されていた、 ユーザのプライマリグループの値が反映されます。新しいファイルや ディレクトリを作成する場合は、これらオブジェクトの初期状態での パーミッションは事前に設定した内容に沿って決められます。詳しくは 17.5項 「ファイルのパーミッション」 をお読みください。

ファイルやディレクトリの所有者 (もちろん root を含みます) は、 そのオブジェクトに対するパーミッションを変更することができます。

ファイルやディレクトリのパーミッションのようなオブジェクト属性を 変更するには、 chmod コマンド を利用し、下記のようなパラメータを指定します:

  • パーミッションを与えるまたは取り除く対象のユーザ

  • 与えたり取り除いたりしたいパーミッションの種類

  • パーミッションを変更したいファイルやフォルダ (複数を指定する場合はスペースで区切ります)

パーミッションを与える対象としては、それぞれ ファイルの所有者 (ユーザ, u), ファイルを所有するグループ (グループ, g), その他のユーザ (その他, o) の 3 つの種類があります。また、パーミッションの種類としては 読み込み、書き込み、実行の 3 種類があります。

root では、 chown (change owner) コマンドを 利用して、ファイルの所有者を変更することもできます。これにより、 異なるユーザに所有者を変更することができます。

17.5.3.1. パーミッションと所有者の変更例

下記の例では、まずシェル内での ls -l コマンドの出力結果を示します。

例17.2 ファイルとフォルダのパーミッション

-rw-r----- 1 tux users      0 2006-06-23 16:08 checklist.txt
-rw-r--r-- 1 tux users  53279 2006-06-21 13:16 gnome_quick.xml
-rw-rw---- 1 tux users      0 2006-06-23 16:08 index.htm
-rw-r--r-- 1 tux users  70733 2006-06-21 09:35 kde-start.xml
-rw-r--r-- 1 tux users  47896 2006-06-21 09:46 kde_quick.xml
drwxr-xr-x 2 tux users     48 2006-06-23 16:09 local
-r-xr-xr-x 1 tux users 624398 2006-06-23 15:43 tux.jpg

上記の例では tux ユーザが kde-start.xml のファイルを所有していて、読み込み と書き込みは行なうことができるものの、実行はできないように設定されて います。 users グループからは読み込みだけを 行なうことができますが、書き込みや実行は行なえません。他のユーザでも 同様です。

手順17.4 パーミッションの変更

利用中のユーザが tux であり、 ファイルのパーミッションを変更する場合、それぞれ下記のようになります。

  1. kde-start.xml ファイルに対して、 users グループにも書き込みアクセスを許可する には、下記のように入力します:

    chmod g+w kde-start.xml
  2. kde-start.xml ファイルに対して、 users グループや他のユーザに対して書き込み アクセスを許可するには、下記のように入力します:

    chmod go+w kde-start.xml
  3. すべてのユーザに対して書き込みアクセスを禁止するには、下記のように 入力します:

    chmod -w kde-start.xml

    ユーザの種類を指定しない場合、変更はすべてのユーザに対して適用されます。 つまり、ファイルの所有者、所有グループ、他のユーザのすべてに対して 適用されることになります。上記のように実行することで、再度書き込み アクセスを許可するまでは所有者 tux でさえも書き込むことができなくなります。

  4. users グループとその他のユーザに対して、 local ディレクトリへの移動を禁止するには、 下記のように入力します:

    chmod go-x local
  5. kde_quick.xmlgnome_quick.xml の 2 つのファイルに対して その他のユーザの書き込み権限を与えるには、下記のように入力します:

    chmod o+w  kde_quick.xml gnome_quick.xml

手順17.5 所有者の変更

下記の手順では、 tux ユーザで ログインしていて、 kde_quick.xml ファイルの 所有権を他のユーザ (wilber) に 移したい場合を想定しています。この場合、下記のように入力します:

  1. root でログインするか、もしくは何らかの方法で root に移行します。

  2. その状態から、下記のように入力します:

    chown wilber kde_quick.xml
  3. 変更結果は、下記を入力すると確認することができます:

    ls -l kde_quick.xml

    下記のように出力されるはずです:

    -rw-r--r-- 1 wilber users  47896 2006-06-21 09:46 kde_quick.xml
  4. これで期待通りに所有権を移すことができました。最後に通常のユーザに 戻れば作業完了です。

17.6. シェルの便利な機能

今までの例でおわかりのとおり、 bash でのコマンドを実行する際には、とても 長い入力を要してしまいます。下記では、入力の時間を省いて作業を効率化する ための様々な bash 機能を紹介しています。

履歴

既定では、 bash は以前に入力したコマンドを 記憶 しています。この機能を 履歴 と呼びます。以前に 入力したコマンドは閲覧することができるだけでなく、選択して実行する 機能も備えています。過去の履歴を参照するには、 を、必要なコマンドがプロンプトに現われるまで繰り返し押してください。 また表示された履歴を逆にたどるには、 を 押します。また、 bash が記憶している履歴を素早くたどることもできます。 コマンドの冒頭部分を入力して Page ↑ を押して ください。これにより、冒頭部分が一致する過去の履歴だけをたどることが できます。

履歴をたどって必要なコマンドを表示し、編集を終えたら (たとえばファイル 名やパスを修正するなど) 、最後に Enter を押すと そのコマンドを実行することができます。コマンドラインの編集はカーソルを 必要な場所に移動して入力するなどで行なってください。

また、履歴から特定のコマンドを検索することもできます。 Ctrl+R を押すと絞り込み検索を行なうことができます。まずは下記のような プロンプトが表示されます:

 (reverse-i-search)`': 

この状態から何文字かを入力して、検索を行なってください。入力した文字列 で絞り込むことができるようになっています。検索結果はコロン (:) の右側 に、検索文字列は左側にそれぞれ表示されます。検索結果を受け入れるには、 Esc を押します。プロンプトが通常の表示に戻り、 選択したコマンドが表示されます。あとは必要に応じてコマンドを修正し、 Enter を押すと実行することができます。

補完

bash の便利な機能のもう一方として、ファイルやディレクトリ名のうち、冒頭 部分だけを入力することで後ろを自動的に埋める (補完する) ことのできる 機能があります。これを行なうには、最初の部分だけを入力してから <Tab> (タブ) を押してください。該当するファイルやパス が 1 つしか存在しなかった場合は 1 回で補完が完了し、カーソルはファイル名 の後ろまで移動します。あとは必要に応じて、さらなるコマンドのオプション などを入力することができます。該当するファイルやパスが複数存在した場合 (その文字列で始まるファイル名が複数存在する場合) は、確定可能な部分 (つまり、それ以外の候補が存在しなかった部分) までが自動的に補完されます。 そこから再度 <Tab> を押すことで、該当候補を表示させる ことができます。続く文字を入力してさらに <Tab> を 押すと、さらに補完が行なわれます。これらを繰り返して入力を行なって ください。なお、 <Tab> でファイル名とパスの補完を行なう 作業は、入力しようとしているファイルやパスが実際に存在している (かつ正しい スペルを入力している) ことを確認することにもなります。

ワイルドカード

パス名の表記では、 1 つまたは複数のワイルドカードを使用することができます。 ワイルドカードとは他の文字 (または文字列) に対する代用表現で、任意の 文字 (または文字列) を意味するものです。 bash では、下記の 3 種類の ワイルドカードに対応しています:

ワイルドカード

機能

?

任意の 1 文字の代用。

*

任意の長さの文字列に対する代用。

[セット]

大括弧内に書かれた文字のうち、いずれかに対する代用。 セット に文字群を入力します。

17.6.1. 履歴機能や補完機能/ワイルドカードの使用例

下記の例では、 bash で使用する便利な機能について、使用例を示しています。

手順17.6 履歴機能と補完機能の使用例

既に 17.3.1項 「ファイルとディレクトリを利用する作業の例」 で示す作業例を実施している ものと仮定し、お使いのシェルがこれらのコマンドを記憶していて、そこから 履歴機能を使用してたどる場合の使用例を示します。

  1. cd ~ が現われるまで を 繰り返し押します。

  2. ここで Enter を押すとそのコマンドが実行されます。 上記のコマンドでは、お使いのホームディレクトリに移動します。

    たとえば、ホームディレクトリに DocumentsDesktop という同じアルファベットで始まる 2 つのサブディレクトリが存在するものとします。

  3. まずは cd D と入力して <Tab> を押します。

    この時点では何も起こりません。なぜなら bash は、どちらのディレクトリ が正しいのかがわからないからです。

  4. さらにもう一度 <Tab> を押すと、下記のように候補 が表示されるようになります:

    tux@knox:~> cd D
    Desktop/   Documents/
    tux@knox:~> cd D
         
  5. プロンプトにはその時点までに入力したものが表示されています。ここから 次の文字を入力し、 <Tab> を押します。

    これでようやくパスが補完されます。

  6. あとは Enter を押せば、 コマンドを実行することができます。

手順17.7 ワイルドカードの使用

この例では、ホームディレクトリ内に様々な拡張子を持った多数のファイルが 存在しているものと仮定しています。また、異なるファイル名を設定した 複数バージョンのファイル myfile1.txt, myfile2.txt などが存在しているものとします。 これらの属性に基づいて特定のファイルを指定するには、下記のようにして 行ないます。

  1. まずはお使いのホームディレクトリにいくつかのテストファイルを作成します:

    1. touch コマンドを使用し、いくつかの空ファイルを 異なる拡張子で作成します。たとえば .pdf, .xml, .jpg などを指定します。

      これらを繰り返し実施 (bash の履歴機能をお使いください) するか、 もしくは 1 回の touch コマンドで一括指定して ください。この場合は、複数のファイルをスペースで区切って指定します。

    2. さらに、同じ拡張子を持つ 2 つ以上のファイルを作成します。 たとえば .html などです。

    3. さらに複数の バージョン のファイルを作成します:

      touch myfile{1..5}.txt

      上記を入力すると、下記のような 5 つのバージョンのファイルが作成されます:

      myfile1.txt,…,myfile5.txt
    4. ここまでで作成したファイルについて、一覧を表示します。 作成したファイルにもよりますが、たとえば下記のようになっているはずです:

      -rw-r--r-- 1 tux users   0 2006-07-14 13:34 foo.xml
      -rw-r--r-- 1 tux users   0 2006-07-14 13:47 home.html
      -rw-r--r-- 1 tux users   0 2006-07-14 13:47 index.html
      -rw-r--r-- 1 tux users   0 2006-07-14 13:47 toc.html
      -rw-r--r-- 1 tux users   0 2006-07-14 13:34 manual.pdf
      -rw-r--r-- 1 tux users   0 2006-07-14 13:49 myfile1.txt
      -rw-r--r-- 1 tux users   0 2006-07-14 13:49 myfile2.txt
      -rw-r--r-- 1 tux users   0 2006-07-14 13:49 myfile3.txt
      -rw-r--r-- 1 tux users   0 2006-07-14 13:49 myfile4.txt
      -rw-r--r-- 1 tux users   0 2006-07-14 13:49 myfile5.txt
      -rw-r--r-- 1 tux users   0 2006-07-14 13:32 tux.png
             
  2. ここからが本題です。ワイルドカードを利用して様々な条件に合致する ファイルだけを抜き出します:

    1. .html の拡張子を持つファイルを一覧表示する には、下記のように入力します:

       ls -l *.html
    2. また、 myfile.txt の全てのバージョンを表示 するには、下記のように入力します:

      ls -l myfile?.txt

      なお、ここでは ? で指定していますが、これは ファイルの番号付けが全て 1 文字であることからこのような指定に なっています。バージョン番号が上がっていって myfile10.txt のようなファイル名を作成する ことになったら、 myfile.txt の全バージョン を表示するのに * を使用することになります (またはもう 1 つの ? を入れてもかまいません。 myfile??.txt のようになります) 。

    3. たとえば myfile.txt のバージョン 1 から 3 までと、 5 を削除するには、下記のように入力します:

      rm myfile[1-3,5].txt
    4. 結果は下記のコマンドで確認します:

      ls -l

      myfile.txt のバージョンとしては myfile4.txt だけが残っている形になるはずです。

なお、ワイルドカードは 1 つのコマンド内で複数個使用することもできます。 たとえば上記の例で rm myfile[1-3,5].* と入力すると、 rm myfile[1-3,5].txt と同じ結果になります。これは、 該当するファイルの拡張子が全て .txt であるためです。

[Note]rm コマンド内でのワイルドカード

rm コマンド内でのワイルドカード指定は非常に便利な ものですが、危険でもあります: 期待するもの以上にファイルを消してしまう 危険性があるためです。 rm コマンドで削除されるファイル の一覧を確認するには、 rm の前に ls で一覧を表示させてご確認ください。

17.7. テキストの編集

コマンドラインからファイルを編集するには、 vi エディタの使用方法について 知っておく必要があります。 vi はほとんどの UNIX/Linux システムで利用 できる既定のエディタです。このエディタには複数のモードが存在し、その モードごとに異なる機能がキーに割り当てられています。このような仕組みで あることから、初心者には使いにくいものになってしまっていますが、 少なくとも多くの基本的な操作については知っておいたほうがよいでしょう。 なぜなら、 vi 以外のエディタが使用できない状況も発生するためです。

基本的に vi には 3 つの操作モードがあります:

コマンド モード

このモードでは、 vi は特定のキーの組み合わせをコマンドとして 認識します。単語検索や行の削除など、シンプルな作業を実行する ことができます。

挿入 モード

このモードでは、通常のテキストを書き込むことができます。

拡張 モード

このモードはコロンモード (このモードに移行するのに : を押すことから) とも呼ばれ、 vi から検索や単語の置換など、より複雑な 処理を行なうことができます。

下記では (とてもシンプルな) 使用例を示しています。ここから vi を使用して ファイルを開き、編集し、変更点を保存して終了する方法を学ぶことができます。

17.7.1. 例: vi を利用した編集

[Note]キーの表示

下記には、 vi から単にキーを押すだけで実行できる各種のコマンドが書かれて います。これらのコマンドはキーボードや以下の手順では大文字で表示されていますが、 そのまま (Shift などを押さずに) 押してかまいません。 大文字で入力しなければならない箇所については、 Shift を押すことを明記してあります。

  1. vi でファイルを作成して開くには、下記のように入力します:

    vi textfile.txt

    既定では vi は コマンド モードで動作するため、 そのままではテキストを入力することができません。

  2. そこで、 I を押して挿入モードに切り替えます。 端末の最下行の表示が変わり、挿入モードに切り替わったことが わかります。

  3. あとはそのまま文字を入力してください。改行を行ないたい場合は、 いったん Esc でコマンドモードに戻ってから、 O を押すと改行を挿入することができます。 さらに入力を続ける場合は再度挿入モードに移行してください。

  4. 挿入モードでは、カーソルキーや Del キーで テキストを編集することもできます。

  5. vi を終了するには、 Esc を押して再度コマンド モードに移行してください。さらに : を押して拡張モード に移行します。端末の最下行にコロン : が表示されている はずです。

  6. ファイルを保存して終了するには、 wq と入力 (wwrite (書き込み) の意味; qquit (終了) の意味です) し、 Enter を押します。異なるファイル名で 保存したい場合は、 w ファイル名 のように入力して Enter を押します。

    ファイルを保存せずに終了するには、上記の代わりに q! と入力し、 Enter を押します。

17.8. ファイル名やファイル内容の検索

bash では、ファイル名やファイル内容を検索するためのコマンドが いくつか用意されています:

locate

このユーティリティは、 findutils-locate パッケージをインストールした場合にのみ利用できます。 このコマンドは、指定したファイルがどのディレクトリに存在するのかを 調べることができるコマンドです。必要であれば、ファイル名の指定に ワイルドカードを使用することもできます。このプログラムは、あらかじめ この目的のために作成しておいたデータベースを利用して検索を行なう ため、 (ファイルシステム全体を検索する場合に比べて) とても機敏に 動作します。ただし、裏を返せばそれが欠点にもなります: locate コマンド は、データベースを最後に更新したあとに作成されたファイルを検索する ことができませんし、データベースの生成は root ユーザから updatedb を実行する必要があります。

find

find コマンドは指定したディレクトリ内のファイルを 検索するためのツールです。最初のパラメータで検索を開始する ディレクトリを指定します。以降のパラメータはオプションで、 -name を指定すると検索文字列を指定することが できます。このパラメータではワイルドカードによる指定も行なう ことができます。データベースを使用する locate コマンドとは異なり、 find は実際のディレクトリ 内を検索します。

grep

grep コマンドは、指定した検索文字列を指定した ファイル内で検索するコマンドです。検索文字列に該当するものが見つかると、 このコマンドは 検索文字列 が見つかった行とその ファイル名を表示します。ファイル名の指定にワイルドカードを指定する こともできます。

17.8.1. 検索例

KDE と GNOME の各デスクトップでは、ユーザ固有のアプリケーションデータを 隠しディレクトリに保存しています。たとえば .kde.gnome のようなディレクトリです。

  1. お使いのコンピュータでこれらのディレクトリを見つけるには、 KDE の場合は下記を入力します:

    locate .kde

    GNOME の場合は下記を入力します:

    locate .gnome

     

    locate コマンドを実行すると、それぞれファイル名の どこかに .kde.gnome を含む ファイルが表示されます。より詳しく動作を指定したい場合は、 locate のマニュアルページをお読みください。

  2. ホームディレクトリ配下のディレクトリで、 .txt の拡張子を持つ全てのファイルを見つけるには、下記のように入力します:

    find ~ -name '*.txt' -print
  3. ディレクトリ (この場合はホームディレクトリ) 内の全てのファイルに 対して、内容に music という文字列が含まれている ものを表示するには、下記のように入力します:

    grep music ~/*

    ただし、 grep は -i オプションを使用しない限り、 大文字と小文字を区別することにご注意ください。上記のコマンドでは、 Music のような文字列が含まれるファイルが存在して いても、検索結果には表示されません。

    検索文字列に複数の単語を指定したい場合は、二重引用符 (ダブル クオーテーション) を利用して指定します。下記のようになります:

    grep "music is great" ~/*

17.9. テキストファイルの表示

grep でファイル内容を検索すると、検索結果として 検索文字列 を含む行とそのファイル名が表示されます。 このような部分的な情報だけでは、本当に目的のファイルであるのかが判断 しきれない場合がしばしばあります。 bash ではいくつかのコマンドを 利用することで、エディタを使用することなくテキストファイルの一部分を 簡易に表示することができます。

head

head コマンドはテキストファイルの冒頭部分を表示 するためのコマンドです。何もオプションを指定しない場合、 head はテキストファイルの最初の 10 行を表示します。

tail

tail コマンドは head コマンドの 逆です。特に何もオプションを付けずに tail を実行 すると、テキストファイルの最後の 10 行を表示します。このコマンドは、 お使いのシステムにおけるログファイルを閲覧するのに便利です。ログ ファイルでは通常、最も新しい記録がファイルの最後部に存在しているため、 多くの場合は最後の部分だけを読めば十分であるためです。

less

less コマンドはテキストファイル全体を表示するための コマンドです。 Page ↑Page ↓ でそれぞれ半ページずつ移動することができます。また、 Space を押すと 1 ページ分だけ前に進みます。 Home でファイルの 冒頭に、 End でファイルの最後部に移動します。 閲覧モードを終了するには Q を押します。

more

less の代わりに more という コマンドを使用することもできます。これらは基本的に同じ機能を提供する ものですが、こちらのコマンドはページの後戻りができないという点で 異なっています。このコマンドでは Space を押して ページを前に進めてください。ファイルの終わりに到達すると、この プログラムは自動的に終了します。

cat

cat コマンドはファイルの内容を表示するプログラム ですが、一切のユーザ操作無しにファイル全体が出力されます。 cat コマンドはユーザがそのまま利用するには非常に 不便なコマンドですが、他のコマンドと組み合わせる場合は、こちらの ほうが便利であることもあります。

17.10. リダイレクトとパイプ

場合によってはコマンドの出力結果をファイルに出力して後から編集したり、 一方のコマンドの出力を他方のコマンドの入力にして複数のコマンドを つなぎ合わせたりしたほうが、都合のよい場合があります。シェルでは、 このような機能を、リダイレクトやパイプと呼ばれる機能で提供しています。

通常、シェルからの出力は画面 (または端末) に表示されますし、入力は キーボードから行ないますが、特定の記号を入力することで、入力や出力を ファイルや他のコマンドに転送 (リダイレクト) することができます。

リダイレクト

> を利用すると、コマンドの出力結果をファイルに 転送 (出力リダイレクト) することができます。 また、 < を利用すると、特定のファイルをコマンド の入力に使用 (入力リダイレクト) することができます。

パイプ

パイプ記号 | を利用しても出力をリダイレクトする ことができます: ただしパイプの場合は、あるコマンドの出力を次のコマンド の入力として使用して、つなぐことができます。 > や < のような記号とは 異なり、パイプの使用はファイルに限定されることはありません。

17.10.1. リダイレクトとパイプの例

  1. たとえば ls の出力をファイルに書き込むには、 下記のように入力します:

    ls -l > filelist.txt

    このコマンドを実行すると、 ls コマンドで作成した 現在位置するディレクトリの一覧が、ファイル filelist.txt に書き込まれます。

    ただし、 filelist.txt というファイルが既に存在 していた場合は、このコマンドを実行すると既存のファイルを上書きして しまいます。これを防ぐには、 > の代わりに >> を利用してください:

    ls -l >> filelist.txt 

    上記のコマンドでは ls の出力結果を filelist.txt ファイルに追記します。ファイルが 存在しない場合は新しく作成されます。

  2. リダイレクトは入力側にも利用できます。コマンドの入力をキーボードから 行なう代わりに、ファイルを入力として使用することができます。 たとえば下記のようになります:

    sort < filelist.txt

    このコマンドでは sort の入力に filelist.txt ファイルの入力を使用するように 指定しています。結果は画面に表示されます。リダイレクトの組み合わせで、 さらに結果を別のファイルに出力させることもできます:

    sort  < filelist.txt > sorted_filelist.txt
  3. また、コマンドが ls -l のように長い出力を行なってしまうような場合は、 less のような閲覧プログラムとパイプを利用して、ページごとの表示を 行なうことができます。下記のように入力します:

    ls -l | less

    上記を入力すると、現在のディレクトリの一覧を less コマンドから閲覧することができます。

    また、パイプは grep コマンドとしばしば併用します。 これは、あるコマンドの出力結果から特定の文字列が含まれるものだけを 抜き出すために使用します。たとえばカレントディレクトリ内にある ファイルのうち、 tux ユーザが 所有しているファイルの一覧を取り出したい場合は、下記のように入力します:

    ls -l | grep tux

17.11. プログラムの起動とプロセスの処理

17.7項 「テキストの編集」 で勉強したとおり、プログラムはシェル から起動することができます。グラフィカルなユーザインターフェイスを持つ アプリケーションの場合は X ウインドウシステムが起動している状態で、その X ウインドウシステム内の端末から起動する必要があります。たとえば ホームディレクトリにある vacation.pdf ファイルを KDE の端末から閲覧したい場合は、 okular ~/vacation.pdf (または evince ~/vacation.pdf) と入力してください。 これにより PDF ビューアが起動し、ファイルが表示されるようになります。

上記のように端末ウインドウからファイルを開くと、 PDF ビューアが動作して いる間はコマンドラインのプロンプトが表示されず、コマンドラインが 使用できない状態になっていることがわかります。これを変更するには、 端末ウインドウで Ctrl+Z を押してプロセスを一時停止させ、 bg コマンドで プロセスをバックグラウンド (裏) に送ってください。これで vacation.pdf を表示させながら、同時にさらなる コマンドを実行することができるようになります。また、このような バックグラウンド化する処理を、起動する段階から行なうこともできます。 コマンドの最後にアンパサンド (&) を付けてください。 下記のようになります:

okular ~/vacation.pdf &

このようにして複数のバックグラウンドプロセス (ジョブとも呼ばれます) を 同じシェルから起動した場合は、 jobs コマンドでジョブの一覧 (ジョブ番号とその状態) を表示することが できます:

tux@linux:~> jobs
[1]   Running        okular book.opensuse.startup-xep.pdf &
[2]-  Running        okular book.opensuse.reference-xep.pdf &
[3]+  Stopped        man jobs

いったんバックグラウンドに送ったプロセスを再度フォアグラウンド (表) に 持ってくるには、 fg ジョブ番号 を使用します。

job コマンドでは同じシェルから起動した プロセス (プログラム) だけを表示することができますが、 ps を利用すると、 (特に何もオプションを指定しない場合は) 他の端末から起動したものを含む全てのプロセスを表示します。 たとえば下記のような出力になります:

tux@linux:~> ps
PID TTY          TIME CMD
15500 pts/1    00:00:00 bash
28214 pts/1    00:00:00 okular
30187 pts/1    00:00:00 kwrite
30280 pts/1    00:00:00 ps

プログラムによっては、不具合などで通常の方法での終了が行なうことが できない場合があります。このような場合は kill コマンドを利用して、そのプログラムのプロセス (複数である 場合もあります) を停止させてください。このコマンドは ps コマンドで表示されるプロセスの ID (PID) をパラメータに取ります。 たとえば、上記のように表示されている状態から KWrite エディタを終了する には、下記のように入力します:

kill 30187

上記のコマンドを入力すると、 TERM と呼ばれる シグナル (信号) をプログラムに送信します。このシグナルは、プログラムに 対して終了を指示するためのものです。

終了させたいプログラムが、 jobs コマンドで表示される バックグラウンドプロセスであった場合は、 kill コマンドにジョブ番号を指定して実行することもできます。ジョブ番号で指定する 際は、下記のようにパーセント記号 (%) を付けて指定して ください:

kill %ジョブ番号

kill コマンドでも終了させることができない場合も あります。このような場合はプログラムを強制終了させることができます。 下記のように入力してください:

kill -9 PID

上記のコマンドでは、 TERM シグナルの代わりに KILL シグナルを送信します。このシグナルは 強制終了を意味するもので、ほとんどの場合プログラムを終了させる ことができます。

この章では、ジョブやプロセスを管理するための基本的なコマンドを紹介して きました。システム管理者向けにさらなる概要を知りたい場合は、 in 項 「プロセス」 (第2章 システム監視ユーティリティ, ↑システム分析とチューニングガイド) をお読みください。

17.12. 重要な Linux コマンド

この章では、最も重要なコマンドについて説明を示しています。実際には、 この章で紹介しているものよりもずっと多くのコマンドが存在しています。 この章では個別のコマンドのほか、パラメータの一覧などを紹介しています。 様々なコマンドについてさらに詳しく知るには、それぞれのマニュアルページを ご覧ください。マニュアルページは man に続けてコマンド を入力することでアクセスすることができます。 たとえば man ls. のように入力 してください。

マニュアルページはシェル内に直接表示されます。閲覧時にはそれぞれ Page ↑Page ↓ を押すと 上下に移動することができます。また、マニュアルページの冒頭に戻るには Home を、最後部に移動するには End を押してください。表示を終了するには Q を押します。 man コマンドそれ自身に ついて詳しく知るには、 man man と入力してください。

下記の概要では、個別のコマンド要素を異なる字体で表示しています。 実際のコマンドと必須のオプションは command option のように表示しています。任意指定のパラメータは [square brackets] のように大括弧で表示しています。

また、要件に合わせてコマンドを修正してください。たとえば ls file というコマンドであれば、 file の部分を適宜変更してください。また、複数のパラメータを一括で指定する こともできます。たとえば ls -l -a の代わりに ls -la と指定することもできます。

17.12.1. ファイルコマンド

下記の章では、ファイル管理を行なう際に利用する最も重要なコマンドについて 説明を行なっています。一般的なファイル管理から、ファイルシステムでの アクセス制御リスト (ACL) の捜査までの範囲をカバーしています。

17.12.1.1. ファイル管理

ls [オプション] [ファイル]

何もオプションを付けずに ls を実行すると、 現在位置するディレクトリ内にあるファイル一覧を短い形式で出力します。

-l

詳細な (長い) 形式で一覧表示します。

-a

隠しファイルを表示します。

cp [オプション] コピー元 コピー先

コピー元 から コピー先 にファイルをコピーします。

-i

コピー先 に既にファイルが存在していた場合、 問い合わせメッセージして待機します。

-r

再帰的なコピーを行ないます (サブディレクトリ内もコピーします)。

mv [オプション] 移動元 移動先

いったん 移動元 から 移動先 にファイルをコピーし、その後 移動元 を削除します。

-b

移動の前に 移動元 のバックアップコピーを 作成します。

-i

移動先 に既にファイルが存在していた場合、 問い合わせメッセージを表示して待機します。

rm [オプション] ファイル

指定したファイルを削除します。ディレクトリについては、 -r オプションが指定された場合を除いて 削除が行なわれません。

-r

サブディレクトリがあれば、それらについても削除します。

-i

それぞれのファイルを削除する際に問い合わせメッセージを 表示して待機します。

ln [オプション] リンク元 リンク先

リンク元 から リンク先 に対して 内部リンクを作成します。通常は同じファイルシステム内でしか実行 できませんが、 ln-s オプションを指定して実行すると、ファイルシステムを超えることの できるシンボリックリンクを作成することもできます。

-s

シンボリックリンクを作成します。

cd [オプション] [ディレクトリ]

現在位置しているディレクトリを変更します。 cd コマンドに何もパラメータを指定しないと、 ユーザのホームディレクトリに移動します。

mkdir [オプション] ディレクトリ

新しいディレクトリを作成します。

rmdir [オプション] ディレクトリ

そのディレクトリ内に何もファイルやサブディレクトリが存在 しない場合に限り、ディレクトリを削除します。

chown [オプション] ユーザ名[:[グループ]] ファイル

ファイルに対する所有権を、ユーザ名で指定したユーザに移行します。

-R

全てのサブディレクトリに対して処理を行ないます。

chgrp [オプション] グループ名 ファイル

ファイル で指定したファイルに対する所有権を、 指定したグループに移行します。ファイルの所有者は、そのファイルに 設定されている現在のグループと、新しく設定するグループの両方に 属するメンバーである場合にのみ、グループを変更することができます。

chmod [オプション] モード ファイル

パーミッションを変更します。

モード パラメータは 3 つの部分から成っています: グループ, アクセス, アクセス種類 です。 グループ には下記を指定することができます:

u

所有者自身

g

グループ

o

その他

アクセス には、権利を与える場合には + を、権利を取り除くには - を指定します。

アクセス種類 には下記を指定することができます:

r

読み込み

w

書き込み

x

実行 (ファイルの場合はそのファイルの実行、ディレクトリの場合は そのディレクトリへの移動の意味になります)

s

setuid ビット。これを設定すると、そのアプリケーションやプログラム を実行したとき、そのファイルの所有者に成り代わって実行することが できます。

また、上記の代わりに数字による指定も行なうことができます。数字は 4 桁の 8 進数で指定します。最初の 1 桁目は setuid ビット (4), setgid (グループ ID) ビット (2), スティッキー (sticky) (1) ビット を表わしています。それぞれ有効にしたいものの数字を足して 1 桁目の 数字としてください。あとの 3 桁はそれぞれ 1 桁ずつ所有者、グループ、 その他のユーザの意味で、各桁は読み込み (4), 書き込み (2), 実行 (1) を表わしています。同様に有効にしたいものの数字を足して桁を構成して ください。たとえば 0600 とすると、所有者だけが読み書きできるファイル の意味になります。

gzip [パラメータ] ファイル

このコマンドは、複雑な数学処理でファイルの圧縮を行ないます。 圧縮されたファイルは .gz という拡張子が付与され、 元のファイルに戻す際には展開処理が必要になります。複数のファイルや ディレクトリ全体を圧縮したい場合は、 tar コマンドを お使いください。

-d

gzip ファイルを展開し、元のファイルに戻します (gunzip と同じ意味になります)

tar オプション アーカイブ ファイル

tar は 1 つ以上のファイルをアーカイブと呼ばれる 書庫に格納します。圧縮については行なうかどうかを自由に設定できます。 tar はとても複雑なコマンドであるため、最もよく 使用されるオプションのみを表示します:

-f

アーカイブを画面ではなくファイルに出力します。このオプションは、 通常の作業では必ず指定します。

-c

新しい tar アーカイブを作成します。

-r

既存のアーカイブにファイルを追加します。

-t

アーカイブの内容を出力します。

-u

アーカイブにファイルを追加しますが、そのファイルがアーカイブに あるものよりも新しい場合にのみ追加します。

-x

アーカイブからファイルを取り出します (展開)

-z

gzip でアーカイブを圧縮します。

-j

bzip2 でアーカイブを圧縮します。

-v

処理したファイルを一覧表示します。

tar で作成した圧縮されていないアーカイブファイルは、 通常 .tar の拡張子を設定します。アーカイブが gzip で圧縮されている場合は、 .tgz.tar.gz のような拡張子を設定します。また、 bzip2 で 圧縮している場合は、 .tar.bz2 の拡張子を 設定します。

locate パターン

このコマンドは、 findutils-locate パッケージをインストールしている場合にのみ、利用することができます。 このコマンドは、指定したファイルがどのディレクトリに存在するのかを 調べることができるコマンドです。必要であれば、ファイル名の指定に ワイルドカード を使用することもできます。このプログラムはあらかじめ、この目的のために 作成しておいたデータベースを利用して検索を行なうため、 (ファイルシステム全体を検索する場合に比べて) とても機敏に動作します。 ただし、裏を返せばそれが欠点にもなります: locate コマンドは、 データベースを最後に更新したあとに作成されたファイルを検索する ことができませんし、データベースの生成は root ユーザから updatedb を実行する必要があります。

updatedb [オプション]

このコマンドは、 locate コマンドで使用する データベースを更新するためのコマンドです。既存の全てのディレクトリ を含めるように指定するには、プロクセラムを root で実行する 必要があります。また、このコマンドはアンパサンド (&) を付けてバックグラウンド (裏) で 処理させる (updatedb &) ことをお勧めします。 これにより、同じシェルから次の作業にすぐ取りかかることができる ようになるためです。また、このコマンドは通常、日次の cron ジョブ (cron.daily をお読みください) で実行される ものです。

find [オプション]

find コマンドは指定したディレクトリ内のファイルを 検索するためのツールです。最初のパラメータで検索を開始する ディレクトリを指定します。以降のパラメータはオプションで、 -name を指定すると検索文字列を指定することが できます。このパラメータではワイルドカードによる指定も行なう ことができます。データベースを使用する locate コマンドとは異なり、 find は実際のディレクトリ 内を検索します。

17.12.1.2. ファイル内容にアクセスするコマンド

file [オプション] [ファイル]

file を利用すると、指定したファイルの内容を判別する ことができます。

-z

圧縮ファイルの中身まで判別を行なう。

cat [オプション] ファイル

cat コマンドは、指定したファイルの内容を表示します。 ただし、一切のユーザ操作無しにファイル全体を出力します。

-n

左側に行番号を表示します。

less [オプション] ファイル

このコマンドはテキストファイル全体を表示するためのコマンドです。 PgUpPgDn で それぞれ半ページずつ移動することができます。また、 Space を押すと 1 ページ分だけ前に進みます。 Home でファイルの 冒頭に、 End で ファイルの最後部に移動します。 閲覧モードを終了するには Q を押します。

grep [オプション] 検索文字列 ファイル

grep コマンドは、指定した検索文字列を指定したファイル内で検索する コマンドです。検索文字列に該当するものが見つかると、このコマンドは 検索文字列 が見つかった行とそのファイル名を 表示します。ファイル名の指定にワイルドカードを指定することもできます。

-i

大文字と小文字の区別を行なわずに検索します。

-H

見つかったファイルのファイル名を表示します。

-n

見つかった行の行番号を合わせて表示します。

-l

見つかったファイルのファイル名だけを表示します。

diff [オプション] ファイル ファイル 2

diff コマンドは任意の 2 つのファイルを比較するための コマンドです。このプログラムは、一致しなかった全ての行を出力します。 このコマンドは主にプログラマが使用するもので、ソースコード全体を 送信する代わりに、変更点だけを送信する場合に利用します。

-q

ファイルが異なるかどうかだけを表示します。

-u

unified 形式での出力を行ないます。 この方法で出力すると、より可読性に優れた形になります。

17.12.1.3. ファイルシステム

mount [オプション] [デバイス] マウントポイント

このコマンドは、ハードディスクや CD-ROM ドライブなどの任意のデータ メディアを Linux のファイル構造にマウントする (据え付ける) ための コマンドです。

-r

読み込み専用でマウントします。

-t filesystem

ファイルシステムを指定します。一般に Linux のハードディスクの 場合は ext2 を指定します。 MS-DOS で利用して いたものの場合は msdos 、 Windows で利用していた ものの場合は vfat 、 CD メディアなどの場合は iso9660 をそれぞれ指定します。

/etc/fstab ファイル内に設定されていない ハードディスクの場合は、デバイスタイプも指定しておく必要があります。 この場合、 root ユーザ だけがマウントを行なうことができます。その他のユーザでもマウント できるように設定したい場合は、適切な行のオプションに user を指定する必要があります (複数のオプションを 指定する場合はカンマ (,) で区切ります) 。詳しくは mount(1) のマニュアルページをお読みください。

umount [オプション] マウントポイント

このコマンドは既にマウントされているドライブのマウントを解除する コマンドです。データ損失を防ぐため、リムーバブルメディアなどを お使いの場合、メディアを取り出す前にこのコマンドを実行してください。 通常は root ユーザだけが mountumount のコマンドを 実行することができます。他のユーザに対してもこれらのコマンドの実行 を許可するには、 /etc/fstab ファイルの該当する 行に user オプションを設定してください。

17.12.2. システムコマンド

下記の章では、システムに関する情報を取得したり、プロセスやネットワークを 制御したりするための最も重要なコマンドのうち、いくつかを紹介しています。

17.12.2.1. システムの情報

df [オプション] [ディレクトリ]

df (disk free; ディスクの空き容量、の意味です) コマンドをオプション無しで実行すると、マウント済みのドライブについて 全体容量と使用済み容量、空き容量がそれぞれ表示されます。 ディレクトリを指定すると、そのディレクトリのあるドライブについてだけ 表示されるようになります。

-h

人間にとって読みやすい形式 (ギガバイト (G) やメガバイト (M) など) で表示します。

-T

ファイルシステムの種類を指定します (ext2, nfs など) 。

du [オプション] [パス]

このコマンドをパラメータ無しで実行すると、現在位置するディレクトリ 以下にあるサブディレクトリについて、ファイルで使用しているディスク 領域の合計サイズを出力します。

-a

個別のファイルごとにサイズを表示します。

-h

人間にとって読みやすい形式で出力します。

-s

合計容量だけを表示します。

free [オプション]

free コマンドはメモリとスワップ領域に関する情報を 表示するためのコマンドで、全体量と使用済みの量をそれぞれ表示します。 詳しくは 項 「free コマンド」 (第11章 特殊なシステム機能, ↑リファレンス) をお読みください。

-b

バイト単位で出力します。

-k

キロバイト単位で出力します。

-m

メガバイト単位で出力します。

date [オプション]

このシンプルなプログラムは、現在のシステム時刻を表示します。 root から実行した場合は、 システム時刻を修正することもできます。このプログラムに関する詳細は、 date(1) のマニュアルページをお読みください。

17.12.2.2. プロセス

top [オプション]

top コマンドは現在実行中のプロセスに対して、 わかりやすい概要を表示することができます。 H キーを押すと、このプログラムのカスタマイズ方法に関する説明が 表示されます。

ps [オプション] [プロセス ID]

何もオプションを付けずに実行すると、お使いのユーザに属するプロセスの 一覧が表示されます。このコマンドに対するオプション指定は、ハイフンを 付けずに指定します。

aux

自分が所有していないものを含む全てのプロセスを詳細に表示します。

kill [オプション] プロセス ID

不幸にもプログラムを通常の方法で終了することができない場合があります。 このような場合は kill コマンドでそのプロセス ID (topps をお読みください) を指定して実行することで、それらのプログラムを停止させることができます。 通常、 kill はプログラムを停止するのに TERM と呼ばれるシグナルを送信しますが、これでも 停止できない場合は、下記のパラメータを設定してみてください:

-9

TERM シグナルの代わりに KILL シグナルを送信します。これにより、ほぼ全ての場合において プロセスを終了させることができます。

killall [オプション] プロセス名

このコマンドは kill に似た機能を持っていますが、 プロセス ID の代わりにプロセス名を指定します。名前で指定することで、 その名前に一致する全てのプロセスに対してシグナルを送信します。

17.12.2.3. ネットワーク

ping [オプション] ホスト名または IP アドレス

ping コマンドは TCP/IP ネットワークにおいて ネットワークの疎通確認を行なうための標準的なツールです。 宛先のホストに小さなデータを送信し、即時の応答を要求します。 問題なく動作すれば ping は応答結果を表示します ので、ネットワークの接続が基本的なレベルでは問題のないことが 判明します。

-c回数

送信回数 (と受信回数) を指定します。 (既定では無制限に送信し続けます)

-f

flood ping (ping の洪水) と呼ばれる機能を 有効にします。できる限り数多く送信するようにします。 ネットワークに負荷をかけるテストであるため、 root ユーザでしか 実行することができません。

-i

送信間隔を秒単位で指定します。 (既定では 1 秒間隔です)

host [オプション] ホスト名 [サーバ]

指定したホスト名を IP アドレスに変換します。 このツールでは、ホスト名をネームサーバ (DNS サーバ) に送信することで 変換を行ないます。

ssh [オプション] [ユーザ名@]ホスト名 [コマンド]

SSH はネットワークを介した遠隔作業を行なうためのインターネット プロトコルです。 SSH はそのプロトコルを利用するプログラム自身の 名前でもあり、このプログラムを利用することで遠隔からの作業を 行なうことができるようになります。

17.12.2.4. その他

passwd [オプション] [ユーザ名]

一般ユーザの場合は、このコマンドを使用することで、必要にときに自分の パスワードを変更することができます。管理者 (root) の場合は、システム上 にある任意のユーザを指定してパスワード変更を行なうことができます。

su [オプション] [ユーザ名]

su コマンドは、実行中のシェルから他のユーザに 成り代わるためのコマンドです。ユーザ名とそのユーザに対して設定した パスワードを入力してください。 なお、 root ユーザの場合には、 システム管理者であることからパスワードを尋ねられることなくユーザを 切り替えることができます。ユーザ名を指定しない場合は root が指定されたものと して扱われ、 root の パスワードを入力するよう促されます。認証が成功するとスーパーユーザ (root) になることができます。 なお、異なるユーザに対してシェルを起動する場合は、 su - をご利用ください。

halt [オプション]

データの損失を避けるため、このプログラムを利用してお使いのシステム を終了させてください。

reboot [オプション]

halt コマンドと同じような動作を行ないますが、 こちらの場合はシステム終了後に再起動を行ないます。

clear

このコマンドはコンソールの出力を消去します。オプションはありません。

17.12.3. さらなる情報

この章に掲載されているものよりもずっと多くのコマンドが存在しています。 それらその他のコマンドや、上記で掲載されているコマンドのさらに詳しい情報 については、 O'Reilly (オライリー) 社の出版物 Linux in a Nutshell をお読みになることをお勧めします。


openSUSE スタートアップ 13.1