第27章 シェルの使用

目次

27.1. コマンドラインでバッシュを使用する
27.2. ユーザとアクセス権
27.3. Linuxの重要なコマンド
27.4. viエディタ

概要

グラフィカルユーザインタフェースは、今日、Linuxにおいてますます重要性を増していますが、日常業務を行うのにマウスを使うことが常に最良というわけではありません。コマンドラインが非常に柔軟で効率的だからです。テキストベースのアプリケーションは、遅いネットワークリンク上でコンピュータを制御する場合、またはxtermのコマンドラインでrootとしてタスクを実行する場合に、特に重要です。バッシュシェルは、SUSE Linuxのデフォルトのコマンドラインインタプリタです。

Linuxはマルチユーザのシステムで、ファイルへのアクセスはユーザパーミッションによって制御されています。コマンドラインとGUIのどちらを使う場合でも、パーミッションの概念を理解しておくことは役立ちます。コマンドラインを使う場合、多数のコマンドが重要です。viテキストエディタは、コマンドラインからシステムを設定する場合によく用いられます。これはまた、多くのシステム管理者および開発者の間で人気があります。

27.1. コマンドラインでバッシュを使用する

KDEタスクバーの中には、貝殻付きのモニタの形のアイコンがあります。このアイコンをクリックすると、コマンドを入力するためのコンソールウィンドウが表示されます。ターミナルプログラムであるKonsoleは通常、GNUプロジェクトの一部として開発されたプログラムであるバッシュ(Bourne again shell)を実行します。GNOMEデスクトップでは、 上部のパネルにあるコンピュータモニタの形をしたアイコンをクリックするとターミナルが起動し、通常はバッシュを実行します。

このシェルを開き、最初の行にあるプロンプトを確認します。このプロンプトは通常、ユーザ名、ホスト名、および現在のパスによって構成されていますが、カスタマイズすることもできます。カーソルがこのプロンプトの右端にあるときは、使用中のコンピュータシステムに対してコマンドを直接入力できます。

27.1.1. コマンドの入力

1つのコマンドは複数の要素によって構成されています。最初の要素は必ず、実際のコマンド自体であり、その後にパラメータまたはオプションが続きます。Enterを押した時点で、そのコマンドが実行されます。このキーを押す前は、コマンドラインの編集、オプションの追加、または入力ミスの訂正などを簡単に行えます。非常に使用頻度の高いコマンドの1つに、lsというコマンドがあります。 これは、引数ありでも、引数なしでも使用できます。引数なしでlsコマンドを入力すると、カレントディレクトリの内容が表示されます。

オプションのプリフィックス(接頭辞)として、ハイフンを付けます。たとえば、ls -lコマンドは、同じディレクトリの内容を詳しい情報付きで表示します(長いリスト形式)。各ファイル名の隣に、そのファイルの作成日、バイト単位のサイズ、および後で紹介する他の詳細情報が表示されます。多くのコマンドで使用可能な重要なオプションの1つに、--helpオプションがあります。ls --helpと入力すると、lsコマンドのすべてのオプションが表示されます。

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

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

シェルを効率よく使用するために、Linuxシステムのファイルおよびディレクトリの構造についてある程度知っておくと、非常に役立ちます。ディレクトリは、ファイル、プログラム、およびサブディレクトリが保存されている電気的なフォルダと考えることができます。階層の最上位にあるディレクトリはルートディレクトリであり、/で表されます。ここから、他のすべてのディレクトリにアクセスできます。

/homeディレクトリは、各ユーザが自らの個人用ファイルを格納するためのディレクトリです。図 27.1. 「標準的なディレクトリツリーの例」は、xyzlinux、およびtuxというサンプルユーザのホームディレクトリを含む、Linuxの標準的なディレクトリツリーを示しています。Linuxシステムのディレクトリツリーは、FHS (Filesystem Hierarchy Standard)に準拠する機能的な構造を採用しています。次に、Linux環境内にある標準的なディレクトリに関してリスト形式で簡単に説明します。

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

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

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

/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など)を格納するディレクトリ

27.1.3. バッシュの機能

このシェルには、作業を容易にする2つの重要な機能があります。

履歴

ヒストリー(履歴)機能以前に入力したコマンドを再実行したい場合は、そのコマンドがプロンプト上に表示されるまで、を押します。を押すと、以前に入力したコマンドが、その時点からの入力順で表示されます。コマンドラインを編集するには、矢印キーを使用して希望の場所までカーソルを移動し、編集を行います。次のキーCtrl-Rを使用すると、履歴を検索することができます。

補完

一意に識別できる最初の数文字が入力された後、ファイル名を展開してファイル名全体を自動的に表示する機能です。これを行うには、最初の数文字を入力してからTabを押します。それらの文字で始まるファイルが複数存在する場合は、Tabを2回押すと、それらのファイルのリストが表示されます。

27.1.3.1. 最初の例:ファイルの管理

ここまでで、コマンドの形式、内に存在するディレクトリ、およびバッシュを使用して迅速に作業する方法を学んだので、それらの知識を活用して簡単な作業を練習として実際に行ってみましょう。

  1. シェルのアイコンをクリックして、KDEまたはGNOMEデスクトップからコンソールを開きます。

  2. lsコマンドを入力して、自分のホームディレクトリの内容を表示します。

  3. mkdirコマンド(make directory の略称)を使用して、testという新しいサブディレクトリを作成します。mkdir testと入力します。

  4. 次に、Alt-F2を押し、KDEではkateと入力してKateを、GNOMEではgeditと入力してGeditを起動します。このエディタ内で任意の数文字を入力し、そのファイルをTestfileというファイル名で自分のホームディレクトリ内に保存します。Linuxでは、大文字と小文字が区別されます。この例では、最初の文字のTを大文字にします。

  5. 自分のホームディレクトリの内容をもう一度表示します。lsコマンドをもう一度入力する代わりに、を2回押します。 以前に入力したlsコマンドがプロンプト上に再び表示されます。このコマンドを実行するには、Enterを押します。新しく作成されたtestディレクトリが青い文字、Testfileが黒い文字で表示されます。この表示形式により、コンソール上でディレクトリとファイルを区別することができます。

  6. mvコマンドを使用して、Testfiletestサブディレクトリへ移動します。この作業をすばやく実行するために、展開機能を使用します。mv Tと入力し、Tabを押します。ディレクトリ内に、この文字で始まるファイルが他に存在しない場合、シェルはファイル名を自動的に展開し、estfileという文字列を追加します。または、1文字か2文字を自分で追加入力し、そのたびにTabキーを押して、シェルがファイル名を展開できるかどうかを確認します。最後に、スペースキーを押して、展開したファイル名の後に、testと入力し、Enterキーを押してコマンドを実行します。

  7. この時点で、Testfileは、このディレクトリ内に存在していないはずです。もう一度lsコマンドを入力して、このことを確認します。

  8. ファイルの移動が成功したかどうかを確認するために、cd testコマンドを入力して、testディレクトリへ移動します。そこで、もう一度lsコマンドを実行します。今度は、リスト内にTestfileが見つかるはずです。いつでも、cdとだけ入力してコマンドを実行すると、自分のホームディレクトリへ戻ることができます。

  9. ファイルのコピーを作成するには、cpコマンドを使用します。たとえば、cp Testfile Testbackupと入力すると、TestfileTestbackupにコピーすることができます。ここでも、lsコマンドを使用して、両方のファイルがディレクトリ内に存在しているかどうかを確認できます。

27.1.4. パスの指定

ファイルまたはディレクトリの作業をする場合、正しいパスを指定することが重要です。しかし、ルートから個別のファイルに到達するためにパス全体(絶対パス)を入力する必要はありません。カレントディレクトリを開始場所として使用することができます。表記~を使用して、自分のホームディレクトリを指定できます。 したがって、testディレクトリ内のTestfileファイルをリストする方法は2つあります。相対パスを使用してls testと入力する方法と、絶対パスを使用してls ~/testと入力する方法です。

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

カレントディレクトリは、ドット(.)で表します。ツリー内で、それよりすぐ上にあるレベルは、2つのドット(..)で表します。ls ..と入力すると、カレントディレクトリに対する親ディレクトリの内容が表示されます。ls ../..コマンド は、その階層内で2つ上のレベルにあるディレクトリの内容を表示します。

27.1.4.1. 2番目の例:パスを使用する作業

ここでは、SUSE Linuxシステムのディレクトリ間で移動するためのもう1つの方法の例を挙げます。

  1. 自分のホームディレクトリへ移動するために、引数なしのcdコマンドを使用します。次に、そのディレクトリ内にtest2というディレクトリを作成するために、mkdir test2と入力します。

  2. cd test2と入力して、その新しいディレクトリへ移動し、subdirectoryという名前のサブディレクトリを作成します。そのサブディレクトリへ移動するために、展開機能を使用します。cd suと入力し、Tabを押します。シェルは、ディレクトリ名の残りの部分を展開します。

  3. 今度は、ディレクトリ間で移動することなく、以前に作成したTestbackupファイルをカレントディレクトリ(subdirectory)へ移動する作業を試してみましょう。この作業を実行するには、そのファイルを表す相対パスを指定します。mv ../../test/Testbackup .というコマンドです。 (最後にドットがあることに注意してください)。このコマンドの最後にあるドットは、このファイルの移動先がカレントディレクトリであることをシェルに伝えるために必要です。この例の../../という表記は、自分のホームディレクトリを表しています。

27.1.5. ワイルドカード

このシェルは、パス名を展開するためのワイルドカードという、もう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という文字列をファイル名の一部として使用しているすべてのファイルを削除します。

27.1.6. lessとmore

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

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

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

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

通常、シェル内の標準出力は画面またはコンソールウィンドウであり、標準入力はキーボードです。あるコマンドの出力をlessのような他のアプリケーションへ転送するには、パイプラインを使用します。

testディレクトリ内にあるファイルを表示するには、ls test | lessコマンドを入力します。lessコマンドにより、testディレクトリの内容が表示されます。これらの組み合わせに意味があるのは、lsコマンドによる通常の出力が非常に長い場合だけです。たとえば、ls /devコマンドを使用してdevディレクトリの内容を表示する場合、参照できるのは、ウィンドウ内に表示されているわずかな部分だけです。ls /dev | lessコマンドを使用すると、リスト全体を参照できます。

コマンドの出力をファイル内に保存することもできます。たとえば、echo "test one" > Contentというコマンドは、test oneという語句を含むContentという名前のファイルを生成します。less Contentコマンドを使用すると、このファイルの内容を表示できます。

ファイルをコマンドの入力として使用することもできます。たとえば、trを使って、ファイルContentからリダイレクトされた標準入力の文字を置換し、結果を標準出力に書き出すことを考えてみます。txで置き換えるために、tr t x < Contentと入力します。trの出力は、画面へ送信されます。

出力を格納する新しいファイルが必要な場合、trコマンドの出力をファイルへパイプ(リダイレクト)することができます。これをテストするには、内容をtestに変更してから、コマンドtr t x < ../Content > newを実行します。最後に、newの内容をless newで確認します。

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

27.1.8. アーカイブとデータ圧縮

ここまでで、多くのファイルとディレクトリを作成しました。 次に、アーカイブとデータ圧縮について説明します。ここでは、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ディレクトリとまったく同じものです。

27.1.9. mtools

mtoolsとは、MS-DOSファイルシステムの作業をするための一連のコマンドのことです。mtools内のコマンドを使用すると、1台目のフロッピーディスクドライブをMS-DOS環境と同様にa:として扱ったり、mが接頭辞になる(先頭に付く)点を除き、MS-DOSコマンドに似たコマンドが使用可能になります。

mdir a:

a:ドライブ内にあるフロッピーディスクの内容を表示します。

mcopy Testfile a:

Testfileファイルをフロッピーディスクにコピーします。

mdel a:Testfile

a:にあるTestfileを削除します。

mformat a:

フロッピーディスクをMS-DOS形式でフォーマットします(内部でfdformatコマンドを使用します)。

mcd a:

a:をカレントディレクトリにします。

mmd a:test

フロッピーディスク上にtestサブディレクトリを作成します。

mrd a:test

フロッピーディスクからtestサブディレクトリを削除します。

27.1.10. クリーンアップ

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