次のページ 前のページ 目次へ

4. ファイルとプログラム

4.1 ファイル: 予備知識

Linux は DOS/Win にとても似たディレクトリやファイル構成になっています。 ファイルにはファイル名があり、これらは特別なルールに従います。これらは ディレクトリ内にしまわれ、その中には実行可能ファイルもあり、それらのほ とんどはコマンドスイッチをもっています。さらに、ワイルドカードやリダイ レクト、パイプを使うこともできます。ただし、DOS/Win とは微妙に異なる点 も少しだけあります。

  • DOS 上ではファイル名は 8.3 フォームと呼ばれる形式になっています (例 NOTENOUG.TXT )。Linux ではよりよいものになっています。もしも あなたが ext2 や umsdos 等のファイルシステム上に Linux をインストール した場合は、さらに長いファイル名が使えますし (255 文字まで)、複数の ドットを使うことができます (例えば This_is.a.VERY_long.filename)。 ここで大文字と小文字を混ぜて使ったことに注意してください。実は、
  • ファイル名やコマンドの大文字と小文字は区別されます。 なので、FILENAME.tar.gzfilename.tar.gz は二つの異なるファ イルです。ls はコマンドですが、LS は間違いです。
  • Windows ユーザへ。Linux 上で長いファイル名を使う場合は 気を付けなくてはならないことがあります。 もしもファイル名にスペースが含まれている場合 (お勧めしませんが可能です)、 そのファイル名を入力するときはいつでもファイル名を二重引用符で囲む必要があります。 例えば:
    $ # 次のコマンドで 「My old files」 という名前のディレクトリを作成します。
    $ mkdir "My old files"
    $ ls
    My old files    bin     tmp
    
    さらに、次の文字は使うべきではありません: !*$&#
  • プログラムには .COM や .EXE 、バッチファイルには .BAT というように決まった 拡張子を付ける必要はありません。ls -F コマンドを実行すると 実行ファイルにはアスタリスク 「*」がファイル名の後ろにつきます。 例えば:
    $ ls -F
    I_am_a_dir/   cindy.jpg    cjpg*   letter_to_Joe    my_1st_script*  old~
    
    cjpg*my_1st_script* は実行可能ファイル、 つまりは「プログラム」です。バックアップファイル名は DOS 上では .BAK でおわりますが、Linux では波線「~」になります。 さらに、ファイル名がドットから始まるファイルは隠しファイルと見なされま す。例えば .I.am.a.hidden.file という名前のファイルは ls コマンドでは表示されません。
  • DOS プログラムのスイッチは /switch で使うことができますが、Linux でのスイッチは -switch--switch となります。つまり dir /sls -R になります。たくさんの DOS プログラムでも、例えば PKZIPARJ などは UNIX スタイルのスイッチを使うことを覚えておいてください。

コマンドを DOS から Linux へ翻訳する のセクションまで一気に読み飛ばすこともできますが、 私があなただったらこのまま読み続けます。

4.2 シンボリックリンク

UNIX には DOS では存在しないようなタイプのファイルがあります。 シンボリックリンクです。これはファイルやディレクトリを指し示すもの (ポインタ) で、それが指し示すファイルやディレクトリの 代わりとして使用できます。これは Windows のショートカット に似ていますね。シンボリックリンクの例として、/usr/X11R6/ を指し示す /usr/X11/dev/ttyS0/dev/ttyS1 を指し示す /dev/modem 等があります。

シンボリックリンクを作るには:

$ ln -s <file_or_dir> <linkname>

例:

$ ln -s /usr/doc/g77/DOC g77manual.txt

これで /usr/doc/g77/DOC を参照する代わりに g77manual.txt を参照できます。ディレクトリを表示させた場合、リンクは以下のように見えます。

$ ls -F
g77manual.txt@
$ ls -l
(several things...)           g77manual.txt -> /usr/doc/g77/DOC

4.3 パーミッションと所有権

DOS のファイルとディレクトリは次のような属性を持ちます。 A (アーカイブ)、H (隠しファイル)、R (読み専用)、そして S (システムファイル)。 H と R だけが Linux 上では意味のあるものとなりま す。隠しファイルはドットで始まります。 R 属性についてはこのまま読み進めてください。

UNIX 上ではファイルには「パーミッション」と所有者、 そして所有グループが存在します。次の例を見てください。

$ ls -l /bin/ls
-rwxr-xr-x  1  root  bin  27281 Aug 15 1995 /bin/ls*

最初のフィールドは /bin/ls のパーミッションを含み、 /bin/ls は root に所有され、グループ bin に所属します。 残りの情報は置いておいて、-rwxr-xr-x の意味を探ってみましょう。 左から右へ読んでいきます。

- はファイルのタイプを意味します(- = 普通のファイル、 d = ディレクトリ、l = リンク、等)。 rwx はファイル所有者のパーミッションを意味します (read(読み)、write(書き)、execute(実行));(ここでは group の 意味を説明しませんが、初心者ならこの意味を知らなくても やっていけるでしょう ;-) r-x はほかのユーザに対するパーミッション です(read、execute)。

ディレクトリ /bin もパーミッションを持ちます (詳しくは ディレクトリのパーミッション を参照)。 root でない限り /bin/ls ファイルを削除できないのは、パーミッションで許可されていないからです。 ファイルのパーミッションを変更するには次のようにコマンドを打ちます。

$ chmod <whoXperm> <file>

who は u (user、つまり所有者)、g (group)、o (other)、 X は +-、perm は r (read)、w (write)、か x (execute)。一般的な chmod の使い方は次のようになります。

$ chmod +x file

これでファイルを実行可能にします。

$ chmod go-rw file

所有者以外の読み書き権限を剥奪します。

$ chmod ugo+rwx file

全てのユーザに読み書き、そして実行の権限を与えます。

# chmod +s file

これは「setuid」とか、「suid」と呼ばれるファイル (全てのユーザが 所有者の権限でファイルを実行できる) を作ります。 よく見かけるのは root に setuid したファイルです。 これらは重要なシステムファイルであることがよくあります ( X サーバ等)。

数字を使うことによってパーミッションを素早く設定できます。 rwxr-xr-x は 755 と表現されることができます (全ての文字はビットに対応します:--- は 0、--x は 1、-w- は 2 、-wx は 3 というように)。 難しく見えるかもしれませんが、ちょっと使い込めばすぐ理解 できると思います。 root (スーパーユーザ) は全てのユーザのファイル権限 を変更できます。RMP。

4.4 ファイル: コマンドを翻訳する

左側は DOS コマンド、右側は対応する Linux のコマンド。

ATTRIB:         chmod
COPY:           cp
DEL:            rm
MOVE:           mv
REN:            mv
TYPE:           more, less, cat

リダイレクト記号とパイプ記号: < > >> |

ワイルドカード: * ?

nul: /dev/null

prn, lpt1: /dev/lp0 か /dev/lp1; lpr

DOS                                     Linux
---------------------------------------------------------------------

C:\GUIDO>ATTRIB +R FILE.TXT             $ chmod 400 file.txt
C:\GUIDO>COPY JOE.TXT JOE.DOC           $ cp joe.txt joe.doc
C:\GUIDO>COPY *.* TOTAL                 $ cat * > total
C:\GUIDO>COPY FRACTALS.DOC PRN          $ lpr fractals.doc
C:\GUIDO>DEL TEMP                       $ rm temp
C:\GUIDO>DEL *.BAK                      $ rm *~
C:\GUIDO>MOVE PAPER.TXT TMP\            $ mv paper.txt tmp/
C:\GUIDO>REN PAPER.TXT PAPER.ASC        $ mv paper.txt paper.asc
C:\GUIDO>PRINT LETTER.TXT               $ lpr letter.txt
C:\GUIDO>TYPE LETTER.TXT                $ more letter.txt
C:\GUIDO>TYPE LETTER.TXT                $ less letter.txt
C:\GUIDO>TYPE LETTER.TXT > NUL          $ cat letter.txt > /dev/null
        n/a                             $ more *.txt *.asc
        n/a                             $ cat section*.txt | less

注意:

  • * は Linux 上では便利に使えます:* は隠しファイルを除く全て のファイルにマッチします。.* は全ての隠しファイルにマッチ (カレントディレクトリ「.」と、親ディレクトリ「..」にもマッチ することに注意!);*.* は中間か終わりがドットのファイルにマッチし、 p*r は「peter」と「piper」両方にマッチします。*c* は「picked」 と「peck」の両方にマッチします。
  • more を使用するとき、<SPACE> を押してファイルを読み進め、 「q」で終了します。less はさらに直観的に扱え、矢印キーを使うことがで きます。
  • UNDELETE は存在しないので、何を削除するまえにも良く考えてくださ い
  • DOS で使える < > >> のほかにも、Linux は 2> でエラーメッセージ(stderr)をリダイレクトできます。さらに、 2>&1 は stderr から stdout にリダイレクトし、 1>&2 は stdout から stderr にリダイレクトします。
  • Linux にはほかにもワイルドカードがあります。 [] 使い方: [abc]* は a、b、c で始まるファイルにマッチします。*[I-N1-3] は I、J、K、L、M、N、1、2、3 で終わるファイルにマッチします。
  • lpr <file> はファイルをバックグラウンドで印刷します。 プリント待ちの状態を調べるには lpq、プリント待ちの状態から ファイルを削除する場合は lprm を使います。
  • DOS のような RENAME は存在しません。つまり、mv *.xxx *.yyy はできないということです。REN に似たコマンドは以下で入手可能です。 ftp://sunsite.unc.edu/pub/Linux/utils/file
  • cp -imv -i を使えばファイルが上書きされるときに 警告を表示できます。

4.5 プログラムの起動: マルチタスクとセッション

プログラムを起動するには、DOS でするようにプログラム名をタイプします。 もしプログラムが置かれているディレクトリ (セクション ディレクトリを使う) がパス (セクション システム初期化ファイル) に含まれている場合はプログラムは起動するでしょう。例外として、 DOS と違い Linux 上ではカレントディレクトリに置かれたプログラムは カレントディレクトリがパスに含まれていない限り動きません。 対応策: prog プログラムを動かすには、./prog とタイプします。

一般的なコマンドラインは以下のようになります:

$ command [-s1 [-s2] ... [-sn]] [par1 [par2] ... [parn]] [< input] [> output]

-s1、...、-sn はプログラムのスイッチで、par1、 ...、parn はプログラムのパラメータです。コマンドラインで複数のコ マンドを実行することもできます。

$ command1 ; command2 ; ... ; commandn

これがプログラムを走らせる全てですが、一歩進んだ使い方も簡単にできます。 Linux を使う主な理由のひとつは Linux がマルチタスクな OS だからです。 これは複数のプログラム(これからはプロセスと呼ぶ)を一度に走らせることが できます。プロセスをバックグラウンドで起動してそのまま作業を続ける こともできます。さらに Linux は複数のセッションをあなたに与えてくれます。 これは、まるでたくさんのコンピュータを同時に扱っているみたいですね!

  • 仮想コンソール上でセッション 1 〜 6 に切替えるには <ALT-F1> 〜 <ALT-F6> と押します。
  • 現在の仮想コンソールから去ることなく新しいセッションを同じ仮想コンソー ル内で始めるには、su - <loginname> とタイプします。例えば su - root。これは root でしか実行できないタスクを実行したいとき などに役に立ちます。
  • セッションを終わるには、exit とタイプします。これによって停止された プロセス(後を参照)があれば警告がでます。
  • バックグラウンドでプロセスを実行するにはアンド「&」 をコマンドラインの終わりに付け足します。
    $ progname [-switches] [parameters] [< input] [> output] &
    [1] 123
    
    シェルはプロセスをジョブ番号と(例: [1]; 下を参考)、 PID 番号(Process Identification Number; 上記の例では 123 )で認識します。
  • いくつのプロセスが実行されているのかを調べるには ps ax と タイプします。これは現在起動しているプロセスのリストを出力します。
  • プロセスを kill する (終了させる) には kill <PID> とタイプします。 どうやればプロセスを正しい方法で終了させるか分からない場合は プロセスを kill することが必要になるかもしれません。 あなたが root でない限り、ほかのユーザのプロセスを kill することはでき ません。プロセスは kill -SIGKILL <PID> によってでしか kill できないこともあります。 付け加えると、シェルはプロセスを止めたり、一時的にサスペンドしたり、 プロセスをバックグラウンドに送ったり、バックグラウンドから前面に持って来たり できます。この環境ではプロセスは「ジョブ(job)」と呼ばれます。
  • いくつのジョブが実行されているかを調べるには jobs とタイプしま す。ここではジョブは PID 番号ではなくジョブ番号によって認識されます。
  • 最前面で実行されているプロセスを止めるには <CTRL-C> を押します (いつもうまく行くとは限りません)。
  • 最前面で実行されているプロセスをサスペンドするには <CTRL-Z> を押します(同上)。
  • サスペンドされていたプロセスをバックグラウンドに呼び戻すには bg <%job とタイプします(これはジョブになる)。
  • ジョブを最前面に持って来るには fg <%job とタイプします。 最後にバックグラウンドに送られたジョブを最前面に持って来るには単純に fg とタイプします。
  • ジョブを kill するには、kill <%job とタイプします。 <%job の所は 1、2、3 .. のようになります。

これらのコマンドを使うことによってディスクをフォーマットしたり、 たくさんのファイルを zip で圧縮したり、プログラムをコンパイルしたり、 アーカイブを unzip したりしつつ、同じときにプロンプトを自由 に使えます。同じことを Windows 上でやってみてどれだけ パフォーマンスに違いがあるか試してみてください(もちろんクラッシュ しなかったらの話ですが)。

4.6 リモートコンピュータ上でプログラムを実行する

remote.machine.edu という名前のリモートマシン上でプログラムを実行 するには:

$ telnet remote.machine.edu

ログインの後は好きなプログラムを実行できます。当然ですが、 あなたはリモートマシン上にもアカウントを持っている必要があります。

もしも X11 を持っているならリモートコンピュータ上で X アプリケーショ ンを実行して、それを自分の X 画面上に表示することもできます。remote.machine.edu がリモート X コンピュータで local.linux.box があなたの Linux マ シンだと想定すると local.linux.box から remote.machine.edu にある X プログラムを実行するには以下のようにします:

  • X11 を立ち上げ xterm か同等のターミナルエミュレータを起動し、 以下のようにタイプします:
    $ xhost +remote.machine.edu
    $ telnet remote.machine.edu
    
  • ログインが終わったら次のようにタイプします:
    remote:$ DISPLAY=local.linux.box:0.0
    remote:$ progname &
    
    (DISPLAY... とタイプする代わりに、setenv DISPLAY local.linux.box:0.0 とタイプする必要があるかもしれません。これは リモートコンピュータのシェル次第)

するとどうでしょう! prognameremote.machine.edu で起動され、 あなたのマシン上に表示されます。しかし遅くて使い物にならない のでこれをモデム間では行わないください。さらに、これは危なっかしく雑 な方法です。「Remote X Apps mini-HOWTO」 http://sunsite.unc.edu/LDP/HOWTO/mini/Remote-X-Apps.html (日本語訳: http://www.linux.or.jp/JF/JFdocs/Remote-X-Apps.html) を読んでみてください。


次のページ 前のページ 目次へ

[