# 17.6.4. パーミッションと実行ファイル
**Source**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/fs/permission/
**Parent**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/literacy/email/
それぞれのファイルやフォルダ (ディレクトリ) には**パーミッション**、つまり「ユーザが閲覧や上書き、実行するための権限」が設定されています。ここではパーミッションを確認したり変更する方法とともに、実行ファイルについて説明します。Finder で対応する操作は、[11.7. 詳細情報とアクセス権](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/literacy/filesystem/permission)
に説明があります。
## パーミッションの意味・表示方法 [#](#view)
ファイルやディレクトリのパーミッションを確認するには、`ls` コマンドを `-l` オプション付きで実行します([17.6.2. ディレクトリの操作](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/fs/ope-dir)
)。
ls -l
```
total 38
drwx------ 4 0000000000 student 3072 3 12 15:13 Desktop
drwx------@ 4 0000000000 student 1024 3 6 11:21 Documents
drwx------ 2 0000000000 student 4096 3 2 13:09 Downloads
drwx------ 5 0000000000 student 1024 4 14 2005 ECC
drwx------@ 35 0000000000 student 3072 3 2 09:14 Library
drwx------ 7 0000000000 student 1024 6 23 2005 Mail
drwx------@ 2 0000000000 student 1024 6 30 2005 Movies
drwx------@ 2 0000000000 student 80 1 14 2004 Music
drwx------@ 2 0000000000 student 1024 5 19 2005 Pictures
drwxr-xr-x@ 3 0000000000 student 1024 4 21 2005 Public
drwxr-xr-x@ 3 0000000000 student 1024 4 21 2005 Sites
drwxr-xr-x 2 0000000000 student 1024 3 12 14:36 tex
drwx--x--x 4 0000000000 student 80 6 20 2005 windows
```
ここで、特に
```
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」許可がないとどうなるかの例を示します。
ls -l piyo
```
total 1
-rw-r--r-- 1 0000000000 student 42 3 7 14:29 bar.txt
drw-r--r-- 2 0000000000 student 80 3 7 14:04 fuga
```
cd piyo/fuga
```
-bash: cd: piyo/fuga: Permission denied
```
### 数字による表記法 [#](#oct)
パーミッションはしばしば `644`, `755` などと、8 進法による 3〜4 桁の数字で表されることがあります (8 進法については[12.3. bit列と2進数](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/information/text/basen)
を参照)。各桁はそれぞれ 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)
パーミッションを変更するには、`chmod` コマンドを利用します。
chmod (パーミッションの指定) (対象とするファイル・ディレクトリ)
第 1 引数 (パーミッションの指定) には、次のいずれかを指定します:
- `go-x` のように、今のパーミッションの状態からどの部分を変更するかの指定。\
まず対象者を u(user), g (group), o(others) で指定し、その後に +(許可)、-(禁止)、最後に r(読み取り)、w(変更)、x(実行)の順番で指定する。
- `644`, `775` のように、上で述べた数による表記による指定。
### 例1 [#](#sample1)
次の(意味のない)例では、chmod が 4つありますが、それによって test.tex のパーミッションは次のように変わっていきます。
```
rw-r--r-(最初)→ rwxr-xr-- → rwx--x--- → rwx--x-w- → rwxrwxrw-
```
chmod ug+x test.tex
chmod go-r test.tex
chmod o+w test.tex
chmod ugo+w test.tex
### 例2:書き込み許可の活用 [#](#sample2)
大事なファイルが上書きされたり、削除されたりするのを防ぐため、書き込み許可を変更しておくという方法があります。
ls -l
```
total 8
-rw------- 1 0000000000 student 6 3 13 20:42 memo.txt
-rw------- 1 0000000000 student 10 3 13 20:45 test.txt
```
chmod -w memo.txt
ls -l
```
total 8
-r-------- 1 0000000000 student 6 3 13 20:42 memo.txt
-rw------- 1 0000000000 student 10 3 13 20:45 test.txt
```
このようにすると、`rm` コマンドに対して、「パーミッションでは書き込み許可がないが、本当にやって大丈夫か」という問い合わせがあります。
rm memo.txt
```
override r-------- 0000000000/student for memo.txt?
^C
```
ls -l
```
total 8
-r-------- 1 0000000000 student 6 3 13 20:42 memo.txt
-rw------- 1 0000000000 student 10 3 13 20:45 test.txt
```
さらに、`cp` コマンドによる上書きや、エディタなどによって中身を変更しようとすると、「Permission denied」のエラーが出ることになります。
### 例3:シェルスクリプト [#](#sample3)
コマンドを順番に並べた**シェルスクリプト**([17.3. シェルスクリプト](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/shellscript)
参照)と呼ばれるプログラムがあります。例として、ここでは次の中身を持った test.sh を考えます:
```
#!/bin/sh
echo 3-8-1 Komaba Meguroku Tokyo
echo Todai Taro
```
echo コマンドは、それに続く文字列を出力するコマンドです。
しかし、ただ test.sh を作って保存しただけでは、実行できません。前にも書いたように、実行許可がないファイルは実行できないからです。
ls -l test.sh
```
-rw-r--r-- 1 0000000000 student 60 3 13 21:04 test.sh
```
./test.sh
```
bash: ./test.sh: Permission denied
```
実行許可を与えれば、実行できるようになります。
chmod +x test.sh
ls -l test.sh
```
-rwxr-xr-x 1 0000000000 student 60 3 13 21:04 test.sh
```
./test.sh
```
3-8-1 Komaba Meguroku Tokyo
Todai Taro
```
## 実行ファイル [#](#executable)
実行許可があるファイルを**実行ファイル**といいます。普通は実行ファイルは意味のあるプログラムですが、そうでなければならないという規定はありません。中身が空のファイルだって、実行許可があれば実行ファイルです。
実行ファイルを実行するには、その実行ファイルのパス名を指定すればよいです。例えば /home01/0000000000/bin がカレントディレクトリのとき、その中にある a.out という実行ファイルは
./a.out
/home01/0000000000/bin/a.out
のどちらででも実行できます。
これまで説明してきたいろいろなコマンドも実行ファイルの形になっているものが多いです。例えば、ls, mv コマンドは、実際には /bin/ls, /bin/mv という実行ファイルです。コマンドが実際にはどの実行ファイルであるかは、which コマンドを使って調べることができます。
which ls
```
/bin/ls
```
## 実行ファイルのパス [#](#path)
`ls` コマンドが `/bin/ls` という実行ファイルであるならば、なぜ `ls` コマンドはパス名の指定をしなくても(コマンド名だけで)実行できるのでしょうか?
これは、**実行パス**で指定されているディレクトリの中に `/bin/ls` があるからです。現在の実行パスの値は、環境変数 PATH に格納されています(参考:[17.2. 環境変数](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/env)
)。ECCS iMac 環境では、`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 の値にカレントディレクトリの `.` が含まれていないことに注意して下さい。このため[17.6.1. パスの表記](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/fs/dir)
で触れたように、カレントディレクトリの実行ファイルであってもファイル名だけでは実行できず、`./` を前置する必要があります。
## 拡張ファイル属性 [#](#attr)
`-rw-------@` のように最後に `@` のついたファイルは拡張ファイル属性という、メタデータを持ちます。たとえば関連付けたアプリケーションやフォルダのアイコンなどを保存します。
これらは今のところ、互換性があまりありません。
ECCS iMac端末では以下のような操作を、コマンドから可能です。
- `ls -l@` 拡張ファイル属性の項目を表示
- `xattr -c filename` 拡張ファイル属性を削除
詳細は `man xattr` などで確認できます。