それぞれのファイルやフォルダ (ディレクトリ) にはパーミッション,つまり「ユーザが閲覧や上書き,実行するための権限」が設定されています.ここではパーミッションを確認したり変更する方法とともに,実行ファイルについて説明します.Finder で対応する操作は,14.3.6 詳細情報とパーミッションの操作 に説明があります.
パーミッションの意味・表示方法
ファイルやディレクトリのパーミッションを確認するには,ls コマンドを -l オプション付きで実行します(14.4.2 ディレクトリの操作).
ここで,特に
drwxr-xr-x@ 3 0000000000 student 1024 4 21 2005 Sites
について,左から順に見てみます.
項目 | 意味 |
---|---|
d | ディレクトリであることを表す |
rwx(2〜4文字目) | ファイルの所有者 (user) に対するパーミッション |
r-x(5〜7文字目) | ファイルの所属するグループ (group) に対するパーミッション |
r-x(8〜10文字目) | その他 (others) に対するパーミッション |
0000000000 | ファイルまたはディレクトリの所有者 |
student | そのファイルまたはディレクトリの所属するグループ |
1024 | サイズ(バイト単位) |
4 21 2005 | 作成日時(2005年4月21日を表している) |
Sites | 名称 |
「rwx」「r-x」といった3文字の意味は,次のようになっています.
- 「r」はファイルの読み込み許可を表します.ディレクトリに対してこれがセットされた場合は,「ディレクトリの中身のファイル一覧を ls などで知ることが許可される」という意味です.
- 「w」はファイルの中身の変更の許可,つまり書き込み許可です.ディレクトリに対しては,「その中にファイルを新たに作成したり,中のファイルを消すことなどが許可される」という意味です.
- 「x」はファイルの実行許可です.ディレクトリに対しては,「そのディレクトリの下にあるファイルの情報を取得できる」という意味です.
- 許可がない操作をしようとすると,「Permission denied」というエラーメッセージが出て,実行できません.
例えば所有者 0000000000,グループ student であるファイル a.sh に対する
rwxrw-r-x
というパーミッションは,
- a.sh の中身の読み取りは,すべての人ができる.
- グループ student に属するユーザは,a.sh の中身を書き換えられる.
- a.sh を実行することは,所有者である 0000000000 と,グループ student でないユーザ(つまり others に該当するユーザ)のみ可能である.
ディレクトリに対する「x」許可がないとどうなるかの例を示します.
数字による表記法
パーミッションはしばしば 644, 755 などと,8 進法による 3〜4 桁の数字で表されることがあります (8 進法については18.1.2 2進法, 16進法と8進法を参照).各桁はそれぞれ user, group, others に対応するパーミッションに対応し,また各数字は,2 進法に直したときの「1の位」が実行許可,「2の位」が変更許可,「4の位」が読み取り許可を表しています.
例えば,
rwxrw-r-x, rwxr-----
というパーミッションを数字で表してみます.rwx は 2 進法の 111 に対応するので,8 進法で表すと 7 になります.また rw- は 2 進法の 110 に対応するので,8 進法では 6 です.同様のことを続けて上のパーミッションを 3 桁の数字で表すと,それぞれ 765, 740 となります.
パーミッションの変更
パーミッションを変更するには,chmod コマンドを利用します.
第 1 引数 (パーミッションの指定) には,次のいずれかを指定します:
- go-x のように,今のパーミッションの状態からどの部分を変更するかの指定.
まず対象者を u(user), g (group), o(others) で指定し,その後に +(許可),-(禁止),最後に r(読み取り),w(変更),x(実行)の順番で指定する. - 644, 775 のように,上で述べた数による表記による指定.
例1
次の(意味のない)例では,chmod が 4つありますが,それによって test.tex のパーミッションは次のように変わっていきます.
rw-r--r-(最初)→ rwxr-xr-- → rwx--x--- → rwx--x-w- → rwxrwxrw-
例2:書き込み許可の活用
大事なファイルが上書きされたり,削除されたりするのを防ぐため,書き込み許可を変更しておくという方法があります.
このようにすると,rm コマンドに対して,「パーミッションでは書き込み許可がないが,本当にやって大丈夫か」という問い合わせがあります.
さらに, cp コマンドによる上書きや,エディタなどによって中身を変更しようとすると,「Permission denied」のエラーが出ることになります.
例3:シェルスクリプト
コマンドを順番に並べたシェルスクリプト(25.4 シェルスクリプト 参照)と呼ばれるプログラムがあります.例として,ここでは次の中身を持った test.sh を考えます:
#!/bin/sh echo 3-8-1 Komaba Meguroku Tokyo echo Todai Taro
echo コマンドは,それに続く文字列を出力するコマンドです.
しかし,ただ test.sh を作って保存しただけでは,実行できません.前にも書いたように,実行許可がないファイルは実行できないからです.
実行許可を与えれば,実行できるようになります.
実行ファイル
実行許可があるファイルを実行ファイルといいます.普通は実行ファイルは意味のあるプログラムですが,そうでなければならないという規定はありません.中身が空のファイルだって,実行許可があれば実行ファイルです.
実行ファイルを実行するには,その実行ファイルのパス名を指定すればよいです.例えば /home01/0000000000/bin がカレントディレクトリのとき,その中にある a.out という実行ファイルは
のどちらででも実行できます.
これまで説明してきたいろいろなコマンドも実行ファイルの形になっているものが多いです.例えば,ls, mv コマンドは,実際には /bin/ls, /bin/mv という実行ファイルです.コマンドが実際にはどの実行ファイルであるかは,which コマンドを使って調べることができます.
実行ファイルのパス
ls コマンドが /bin/ls という実行ファイルであるならば,なぜ ls コマンドはパス名の指定をしなくても(コマンド名だけで)実行できるのでしょうか?
これは,実行パスで指定されているディレクトリの中に /bin/ls があるからです.現在の実行パスの値は,環境変数 PATH に格納されています(参考:25.2 環境変数).教育用計算機システムの Mac 環境では,PATH の標準値は次のようになっています.
PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/local/MacGPG2/bin
コマンドをパス名の指定なしに実行しようとすると,PATH に指定されている順番で,それぞれのディレクトリにコマンドが存在しているかが調べられ,最初に見つかった実行ファイルが実行されるという仕掛けになっています.
なお,上の PATH の値にカレントディレクトリの . が含まれていないことに注意して下さい.このため 14.4.1 ディレクトリ で触れたように,カレントディレクトリの実行ファイルであってもファイル名だけでは実行できず,./ を前置する必要があります.