第3章 シェルの使用

目次

3.1. Bashシェルでの作業開始
3.2. ユーザとアクセス権
3.3. Linuxの重要なコマンド
3.4. viエディタ

概要

Linuxシステムを起動すると、通常はグラフィカルユーザインタフェースが使用可能になり、ログイン処理やその後のシステムとのやり取りもこのインタフェースを通じて行われます。グラフィカルユーザインタフェースの重要性は高まり、ユーザにとっても使い易くなりましたが、このインタフェースの使用が、システムとやり取りを行う唯一の方法というわけではありません。通常はシェルと呼ばれる、コマンドを入力できるコマンドラインインタプリタなどのテキストベースのやり取りも可能です。Linuxでは、グラフィカルユーザインタフェースからシェルウィンドウを起動するオプションが提供されているので、両方の方法を簡単に使用できます。

管理面では、シェルベースののアプリケーションは、遅いネットワークリンク上でコンピュータを制御する場合、またはコマンドラインでrootとしてタスクを実行する場合に、特に重要です。Linux「初心者」にとっては、シェル内でコマンドを入力することは多少例外的に感じるかもしれませんが、シェルは管理者のみが使用するものではないことがすぐに実感されるはずです。実際の日常業務の中には、シェルを使用することで最も簡単に素早く行えるものがあります。

UNIXまたはLinuxには複数のシェルが用意されています。SUSE LinuxのデフォルトのシェルはBash(GNU Bourne-Again Shell)です。

この章では、シェルを使用する際に知っておく必要のあるいくつかの基本事項を説明します。これには次のトピックが含まれます。コマンドの入力方法、Linuxのディレクトリ構造、ファイルおよびディレクトリの使用方法、および基本機能の使用方法、Linuxにおけるユーザおよび権限の概念、重要なシェルコマンドの概要、およびUnixとLinuxシステムで常に利用可能なデフォルトエディタであるviエディタの簡単な概要などです。


3.1 Bashシェルでの作業開始

Linuxでは、コマンドラインをグラフィカルユーザインタフェースと併用して、簡単にそれらを切り替えることができます。KDEのグラフィカルユーザインタフェースからターミナルウィンドウを起動するには、パネル内の[Konsole]アイコンをクリックします。GNOMEでは、パネル内の[GNOME Terminal]アイコンをクリックします。

KonsoleまたはGNOMEのターミナルウィンドウが表示され、図 3.1. 「Bashのターミナルウィンドウの例」のように、先頭行にプロンプトが表示されます。通常、プロンプトにはログイン名(この例ではtux)、コンピュータのホスト名(この例ではknox)、および現在のパス(この例ではホームディレクトリ。チルダ記号(~)で示されます)。リモートコンピュータにログインすると、この情報により、自分が現在作業中のシステムが常に示されます。カーソルがこのプロンプトの右端にあるときは、使用中のコンピュータシステムに対してコマンドを直接入力できます。

図 3.1 Bashのターミナルウィンドウの例

Bashのターミナルウィンドウの例

3.1.1 コマンドの入力

1つのコマンドは複数の要素によって構成されています。最初の要素は必ず、実際のコマンド自体であり、その後にパラメータまたはオプションが続きます。コマンドを入力し、<—Del、およびSpaceを使用して編集できます。オプションを追加したり、入力ミスを訂正することもできます。コマンドは、Enterを押すと実行されます。

[Important]問題がなければメッセージは表示されません

シェルでは詳細は表示されません。一部のグラフィカルユーザインタフェースと比較すると、シェルでは通常、コマンドの実行時に確認メッセージが表示されません。メッセージは問題またはエラーが発生した場合にのみ表示されます。

また、オブジェクトを削除するコマンドを実行する際には注意が必要です。rmといったコマンドを入力してファイルを削除する前に、本当にそのオブジェクトを削除するかどうか確認してください。確認なく削除され、元に戻すことはできません。

3.1.1.1 コマンドの使用(オプションなし)

コマンドの構成を、lsコマンドという簡単な例を使用して見てみましょう。は、ディレクトリの内容をリストするのに使用されます。コマンドは、オプションと共に使用することも、オプションなしで使用することもできます。引数なしでlsコマンドを入力すると、カレントディレクトリの内容が表示されます。

図 3.2 lsコマンド

lsコマンド

MS Windowsとは異なり、Linuxでは、ファイルに.txtなどのファイル拡張子を付けることはできますが、必ずしも付ける必要はありません。このため、lsのこの出力では、ファイルとフォルダを区別するのが困難です。デフォルトでは、色がヒントになります。通常、ディレクトリは青、ファイルは黒で表示されます。

3.1.1.2 コマンドの使用(オプションあり)

ディレクトリのないように関するより詳細な情報を得るには、lsコマンドをオプションの文字列と共に使用するのが適しています。オプションによりコマンドの動作を変更できるので、特定のタスクを実行できます。オプションは空白でコマンドと区切られ、先頭にハイフンが付きます。ls -lコマンドは、同じディレクトリの内容を詳しい情報付きで表示します(長いリスト形式)。

図 3.3 ls -lコマンド

ls -lコマンド

各オブジェクト名の左側に、オブジェクトに関する情報が複数の列で表示されます。最も重要なのは次のとおりです。1列目には、オブジェクトのファイルタイプが表示されます(この例では、dはディレクトリ、-は通常のファイルです)。次の9列には、オブジェクトに対するユーザパーミッションが表示されます。列11および12には、ファイル所有者およびグループの名前が表示されます(この例では、tuxおよびusers)。ユーザパーミッションおよびLinuxのユーザの概念については、3.2項 「ユーザとアクセス権」を参照してください。次の列には、ファイルサイズがバイト単位で表示されます。次に、最終変更日時が表示されます。最後の列には、オブジェクト名が表示されます。

さらに詳細な情報を表示する場合は、lsコマンドの2つのオプションを組み合わせて、「ls -la」と入力します。こうすると、シェルでディレクトリ内の隠しファイルも表示され、先頭にドットを付けて示されます(.hiddenfileなど)。

3.1.1.3 ヘルプの参照

すべてのコマンドのすべてのオプションを暗記する必要はありません。コマンド名は思い出せるのに、オプションがはっきり思い出せないという場合は、コマンドを入力し、空白を空けて「--help」と入力します。この--helpオプションは、多くのコマンドに存在します。「ls --help」と入力すると、lsコマンドのすべてのオプションが表示されます。

3.1.2 Linuxのディレクトリ構造

シェルでは、ファイルマネージャのツリービューのような、ディレクトリおよびファイルのグラフィカルな概要表示を提供していないので、Linuxシステムのデフォルトのディレクトリ構造の基本を理解しておくと便利です。ディレクトリは、ファイル、プログラム、およびサブディレクトリが保存されている電気的なフォルダと考えることができます。階層の最上位にあるディレクトリはルートディレクトリであり、/で表されます。ここから、他のすべてのディレクトリにアクセスできます。

図 3.4. 「標準的なディレクトリツリーの例」は、xyzlinux、およびtuxというサンプルユーザのホームディレクトリを含む、Linuxの標準的なディレクトリツリーを示しています。/homeディレクトリは、各ユーザが自らの個人用ファイルを格納するためのディレクトリです。

[Note]ネットワーク環境のホームディレクトリ

ネットワーク環境で作業している場合、ホームディレクトリは/homeと呼ばれない可能性があります。ファイルシステム内の任意のディレクトリに割り当てられている場合があります。

次に、Linux環境内にある標準的なディレクトリに関してリスト形式で簡単に説明します。

図 3.4 標準的なディレクトリツリーの例

標準的なディレクトリツリーの例
/

ルートディレクトリ(ディレクトリツリーの開始場所)

/home

ユーザの個人的なディレクトリ

/dev

ハードウェアコンポーネントを表すデバイスファイルを格納するディレクトリ

/etc

システム設定に関する重要なファイルを格納するディレクトリ

/etc/init.d

ブートスクリプトを格納するディレクトリ

/usr/bin

一般的にアクセス可能なプログラムを格納するディレクトリ

/bin

ブートプロセスの初期に必要なプログラムを格納するディレクトリ

/usr/sbin

システム管理者用のプログラムを格納するディレクトリ

/sbin

システム管理者用で、ブート時に必要なプログラムを格納するディレクトリ

/usr/include

Cコンパイラ用のヘッダファイルを格納するディレクトリ

/usr/include/g++

C++コンパイラ用のヘッダファイルを格納するディレクトリ

/usr/share/doc

さまざまなドキュメントファイルを格納するディレクトリ

/usr/share/man

システムマニュアルページ(manページ)を格納するディレクトリ

/usr/src

システムソフトウェアのソースコードを格納するディレクトリ

/usr/src/linux

カーネルソースコードを格納するディレクトリ

/tmp/var/tmp

一時ファイルを格納するディレクトリ

/usr

すべてのアプリケーションプログラムを格納するディレクトリ

/var

設定ファイル(たとえば/usrからリンクされるファイル)を格納するディレクトリ

/var/log

システムログファイルを格納するディレクトリ

/var/adm

システム管理データを格納するディレクトリ

/lib

共有ライブラリ(動的にリンクされるプログラム用)を格納するディレクトリ

/proc

プロセスファイルシステムを格納するディレクトリ

/sys

カーネルに関するすべてのデバイス情報が集められる「system」ファイルシステムを格納するディレクトリ

/usr/local

ディストリビューションに依存しないローカルな拡張ファイル群を格納するディレクトリ

/opt

オプションのソフトウェア、たとえば大規模なアドオンプログラムパッケージ(KDE、GNOME、Netscapeなど)を格納するディレクトリ

3.1.3 ディレクトリおよびファイルの使用

特定のファイルまたはディレクトリを指定するには、そのディレクトリまたはファイルへのパスを指定する必要があります。パスを指定するには、次の2つの方法があります。

  • ルートディレクトリから該当するファイルへの全体(絶対)パス

  • カレントディレクトリから始まるパス(相対パス)

絶対パスの先頭には必ずスラッシュが付きます。相対パスの先頭にはスラッシュは付きません。

[Note]Linuxでは大文字小文字が区別されます

Linuxでは、ファイルシステム内で大文字と小文字が区別されます。たとえば、「test.txt」または「Test.txt」と入力すると、Linuxでは区別されます。ファイル名またはパスを入力する場合は、この点に注意してください。

ディレクトリ変更するには、cdコマンドを使用します。コマンドのオプションとして、移動先のディレクトリを入力します。カレントディレクトリは、ドット(.)で表します。ツリー内で、それよりすぐ上にあるレベルは、2つのドット(..)で表します。カレントディレクトリの親ディレクトリに切り替えるには、「cd ..」と入力します。cdコマンドの後ろには必ず空白を入力して、コマンドとオプションを区切ります。プロンプトに、コマンドを実行するディレクトリの親へのパスが表示されます。カレントディレクトリよりも2レベル上のディレクトリに切り替えるには、「cd ../..」と入力します。ls -l ../..は、2レベル上のディレクトリの内容をリストします。

3.1.3.1 ファイル指定の例

3.1.3項 「ディレクトリおよびファイルの使用」cdコマンドでは、相対パスを使用しています。絶対パスも使用できます。たとえば、ホームディレクトリから/tmpのサブディレクトリにファイルをコピーするとします。

  1. まず、ホームディレクトリから、/tmp内にサブディレクトリを作成します。

    1. カレントディレクトリがホームディレクトリではない場合は、「cd ~」と入力してホームディレクトリに切り替えます。「cd ~」と入力すると、ファイルシステム内の任意の場所からホームディレクトリに戻ることができます。

    2. ホームディレクトリで、「mkdir /tmp/test」と入力します。mkdirは「make directory (ディレクトリ作成)」の略です。このコマンドでは、testという名前の新しいディレクトリが/tmpディレクトリ内に作成されます。この場合は、絶対パスを使用してディレクトリが作成されます。

    3. 何が行われたのかを確認するために、「ls -l /tmp」と入力します。新しいディレクトリtestが、/tmpディレクトリの内容の一覧に表示されます。

  2. 次に、ホームディレクトリ内に新しいファイルを作成し、そのファイルを相対パスを使用して/tmp/testディレクトリにコピーします。

    1. touch myfile.txt」と入力します。touchコマンドとmyfile.txtオプションを使用すると、myfile.txt という名前の新しい空のファイルがカレントディレクトリ内に作成されます。

    2. ls -l」と入力して、このことを確認します。新しいファイルが内容の一覧に表示されます。

    3. cp myfile.txt ../tmp/test」と入力します。こうすると、myfile.txtがファイル名を変更せずに、ディレクトリ/tmp/testにコピーされます。

    4. ls -l /tmp/test」と入力して、このことを確認します。ファイルmyfile.txt が、/tmp/testの内容の一覧に表示されます。

他のユーザのホームディレクトリの内容をリストするには、「ls ~username」と入力します。図 3.4. 「標準的なディレクトリツリーの例」で例となっているディレクトリツリーでは、サンプルユーザの1人がtuxという名前です。この場合、ls ~tuxと入力すると、tuxのホームディレクトリの内容をリストできます。

[Note]ファイル名またはディレクトリ名での空白の扱い

ファイル名にスペースが含まれている場合には、空白の前にバックスラッシュ(\)を使用してスペースをエスケープするか、ファイル名を一重または二重引用符で囲んでください。そうしないと、バッシュは、My Documentsのようなファイル名を、2つのファイルまたはディレクトリ名と解釈します。一重および二重引用符の違いは、二重引用符の場合には変数の展開が行われるという点にあります。一重引用符を使えば、シェルは、囲まれた文字列をそのまま用います。

3.1.4 シェルの便利な機能

Bashでコマンドを入力する場合は、入力に手間がかかります。次に、作業をより簡略化して入力の手間を省くことができるBashの機能をいくつか紹介します。

3.1.4.1 履歴および補完

デフォルトでは、入力したコマンドはBashに「記憶」されています。この機能は履歴と呼ばれます。以前に入力したコマンドを再実行したい場合は、そのコマンドがプロンプト上に表示されるまで、を押します。また、を押すと、以前に入力したコマンドが、その時点からの入力順で表示されます。このコマンドはいつでも編集できます。たとえば、ファイルの名前を変更してから、Enterを押してコマンドを実行します。コマンドラインを編集するには、矢印キーを使用して希望の場所までカーソルを移動し、編集を行います。次のキーCtrl-Rを使用すると、履歴を検索することができます。

ファイル名またはディレクトリ名の最初の数文字を入力した後で、その名前全体を補完できるのが、Bashのもう1つの便利な機能です。これを行うには、最初の数文字を入力してから→|を押します。ファイル名またはパスが一意に識別された場合は、一度で補完され、カーソルはファイル名の末尾に移動します。次に、必要に応じて、コマンドの次のオプションを入力します。ファイル名またはパスが一意に識別されない場合は(同じ数文字で始まるファイル名はいくつもあります)、ファイル名またはパスは可能な部分まで補完され、そこから複数のオプションから選択します。もう一度→|を押すと、それらのリストが表示されます。この後、ファイルまたはパスの次の数文字を入力し、→|を押して再び補完を試みます。→|を使用してファイル名およびパスを補完したら、入力したいファイルまたはパスが実際に存在するかどうかを同時に確認できます(スペルが正しいかどうかも確認できます)。

3.1.4.2 ワイルドカード

このシェルは、パス名を展開するためのワイルドカードという、もう1つの規則も用意しています。ワイルドカードは、他の文字を表す文字です。バッシュでは、次のような3種類のワイルドカードを利用できます。

?

任意の1文字に対応します。

*

任意の数文字に対応します。

[set]

角かっこの中で指定されたグループのうち、どれか1つの文字に対応します。 ここでは、setという文字列で代替しています。setの一部として、[:class:]という構文で、文字のクラスを指定することができます。ここでclassは、alnum (英数字)、alpha (英字)、ascii (ASCII文字)などのいずれかです。

グループの先頭で!または^を使用した場合には([!set])、setで識別されるもの以外の1文字にマッチします。

たとえば、testディレクトリの中に、TestfileTestfile1Testfile2、およびdatafileという各ファイルがあるとします。ls Testfile?コマンドは、Testfile1Testfile2をリストします。ls Test*コマンドを使用すると、Testfileもリスト内に含まれます。ls *fil*コマンドは、上記のサンプルファイルすべてを表示します。最後に、ワイルドカードsetを使用して、最後が数字であるサンプルファイルすべてを表示してみます。ls Testfile[1-9]、またはクラスを使って、ls Testfile[[:digit:]]と入力します。

これら4種類のワイルドカードのうち、最も包括性が高いのは、アスタリスク(*)です。1つのコマンドを実行するだけで、あるディレクトリ内に含まれているすべてのファイルを他のディレクトリへコピー、またはすべてのファイルを削除することができます。たとえば、rm *fil*コマンドは、カレントディレクトリ内で、filという文字列をファイル名の一部として使用しているすべてのファイルを削除します。

3.1.4.3 lessおよびmoreによるファイルの表示

Linuxには、テキストファイルをシェル内で直接表示する小さな2つのプログラムが付属しています。lessおよびmoreです。エディタを起動してReadme.txtのようなファイルを読み取る代わりに、less Readme.txtコマンドを入力して、テキストをコンソールウィンドウ内で表示します。Spaceを押すと、1ページ下へスクロールします。Page UpPage Downを使用すると、テキスト内を前方または後方へ移動できます。lessを終了するには、Qを押します。

lessの代わりに、それより古いプログラムであるmoreを使用することもできます。しかし、後方(上)へのスクロールができないので、利便性は劣ります。

lessプログラムは、less is more(少ない方が豊か)ということわざに由来する名前であり、他のコマンドの出力を便利な方法で表示する目的で使用することもできます。このコマンドの機能について理解するには、3.1.4.4項 「リダイレクトとパイプ」を参照してください。

3.1.4.4 リダイレクトとパイプ

通常、シェル内の標準出力は画面またはコンソールウィンドウであり、標準入力はキーボードです。ただし、シェルには、入力または出力をファイルまたは別のコマンドとして別のオブジェクトにリダイレクトする機能が用意されています。たとえば、>および<の記号を使用すると、コマンドの出力をファイルに転送したり(出力リダイレクト)、ファイルをコマンドの入力として使用したりできます(入力リダイレクト)。たとえば、lsなどのコマンドの出力をファイルに書き込む場合は、「ls -l > file.txt」と入力します。こうすると、file.txtという名前のファイルが作成され、このファイルにはlsコマンドによって生成されたカレントディレクトリの内容の一覧が含まれます。ただし、file.txtという名前のファイルが既に存在する場合は、このコマンドを実行すると既存のファイルが上書きされます。それを避けるには、>>を使用します。「ls -l >> file.txt」と入力すると、lsコマンドの出力が、file.txtという名前の既存のファイルに単に追加されます。ファイルが存在しない場合は作成されます。

ファイルをコマンドの出力として使用すると便利な場合もあります。たとえば、trコマンドを使用すると、ファイルからリダイレクトされた文字を置換して、その結果を標準の出力である画面上に書き込むことができます。たとえば、上記の例で、file.txtの文字tをすべてxに置換して、これを画面に出力するとします。それには、「tr t x < file.txt」と入力します。

標準出力と同様、標準エラー出力も画面へ送信されます。標準エラー出力をerrorsというファイルへリダイレクトするには、該当のコマンドに対して2> errorsを指定します。>&alloutput を追加した場合は、標準出力と標準エラー出力の両方が、alloutput という 1 つのファイルに保存されます。

パイプラインまたはパイプもリダイレクトの一種ですが、、パイプの使用はファイルに限りません。パイプ(|)を使用すると、1つのコマンドの出力を次のコマンドの入力として使用して、複数のコマンドを組み合わせることができます。たとえば、lessでカレントディレクトリの内容を表示するには、「ls | less」と入力します。これらの組み合わせに意味があるのは、lsコマンドによる通常の出力が非常に長い場合だけです。たとえば、ls /devコマンドを使用してdevディレクトリの内容を表示する場合、参照できるのは、ウィンドウ内に表示されているわずかな部分だけです。ls /dev | lessコマンドを使用すると、リスト全体を参照できます。

3.1.5 アーカイブとデータ圧縮

ここまでで、多くのファイルとディレクトリを作成しました。 次に、アーカイブとデータ圧縮について説明します。ここでは、testディレクトリ全体をパックして1つのファイルに記録し、そのファイルのバックアップコピーをフロッピーディスクに保存するか、電子メールで送信できるようにしたいと思います。この作業を行うには、tar (tape archiverの略称)コマンドを使用します。tar --helpコマンドを使用すると、tarコマンドのすべてのオプションを表示できます。これらのオプションのうち、重要度の高いものを以下で説明します。

-c

(createの略)新しいアーカイブを作成します。

-t

(tableの略)新しいアーカイブの目次(table of contents)を作成します。

-x

(extractの略)アーカイブをアンパック(展開)します。

-v

(verboseの略)アーカイブの作成中に、すべてのファイルを画面に表示します。

-f

(fileの略)アーカイブファイルに割り当てるファイル名を指定します。アーカイブを作成する場合、このオプションを最後に指定する必要があります。

testディレクトリ、およびその配下のすべてのファイルとサブディレクトリをパックしてtestarchive.tarというアーカイブファイル内に保存するには、-c-fの各オプションを使用します。この例では、テストの目的で、-vも指定して、アーカイブの進行状況を確認します。このオプションは必須ではありません。cdコマンドを使用して、testディレクトリの配置先である自分のホームディレクトリへ移動した後、tar -cvf testarchive.tar testコマンドを入力します。その後、tar -tf testarchive.tarコマンドを使用して、このアーカイブファイルの内容を表示します。testディレクトリ、およびその配下のすべてのファイルとディレクトリは、そのままハードディスク上に残ります。このアーカイブをアンパック(展開)するには、tar -xvf testarchive.tarコマンドを入力します。 しかし、今の時点では、このコマンドを実行しないでください。

ファイル圧縮の場合、よく使われるのはgzipです。bzip2を使えば、さらに圧縮率が良くなります。 gzip testarchive.tar」と入力します(または「bzip2 testarchive.tar」と入力することもできますが、この例ではgzipを使います)。lsコマンドを使用すると、testarchive.tarが存在しなくなっていること、代わりにtestarchive.tar.gzが作成されたことがわかります。このファイルはかなり小さいので、電子メールによる転送やUSBメモリへの保存に適しています。

次に、以前に作成したtest2ディレクトリ内で、このファイルをアンパック(圧縮解除)してみます。この作業を行うには、cp testarchive.tar.gz test2と入力し、このファイルを上記のディレクトリへコピーします。cd test2コマンドを使用して、そのディレクトリへ移動します。拡張子が.tar.gzの圧縮済みアーカイブをunzipするには、gunzipコマンドを使用します。gunzip testarchive.tar.gzと入力します。その結果、testarchive.tarを取り出すことができます。このファイルは、tar -xvf testarchive.tarコマンドを使用して展開、または圧縮解除(tar解除) する必要があります。unzipと圧縮アーカイブの展開は、tar -xvf testarchive.tar.gzで一度に行うこともできます(-zオプションの追加は、必要なくなりました)。lsコマンドを使用すると、新しいtestディレクトリが作成されたことを確認できます。 その内容は、自分のホームディレクトリ内にあるtestディレクトリとまったく同じものです。

3.1.6 クリーンアップ

この入門コースで、Linuxのシェル、言い換えるとコマンドラインの基本について理解できたはずです。rmrmdirコマンドを使用して、テスト用のさまざまなファイルとディレクトリを削除することにより、自分のホームディレクトリをクリーンアップすることもできます。3.3項 「Linuxの重要なコマンド」には、最も重要なコマンドと、それらの機能についての簡単な説明が記されています。