実行権限とスクリプト
配布物に付いてきたスクリプトが、そのままでは動かない
手元に落とした setup.sh を ./setup.sh と打つと Permission denied が返る。中身はただのテキストなのに動きません。Linux では、ファイルを直接起動できるのは実行の権利が立っているときだけだからです。
紛らわしいのは、起動できない原因が 1 つではないことです。次の 3 つが全部そろって、はじめてスクリプトは動きます。
- そのファイルに実行の権利があること
- 1 行目に、どのプログラムで動かすかが書いてあること
- 書かれたプログラムが、実際にそのパスに存在すること
Permission denied なら 1 つ目、bad interpreter なら 3 つ目、と読み分けられます。
1 行目の #! が、動かすプログラムを決めている
ターミナル
#!/bin/bash
#!/usr/bin/env python3先頭 2 文字が #! の行はシバンと呼ばれ、この中身を動かすプログラムの置き場所を書きます。1 行目でなければ効きません。/usr/bin/env をはさむ書き方をよく見かけるのは、Python や Node のようにマシンごとに置き場所が違うものを、探してもらってから起動するためです。
Windows で編集したファイルを持ち込むと、行末に見えない文字が付いて /bin/bash ではない何かを探しに行き、bad interpreter になることがあります。エディタの改行の種類を LF にして保存し直すと直ります。
./ を付けないと見つけてもらえない
ターミナル
$ setup.sh
bash: setup.sh: command not found
$ ./setup.sh名前だけで打つと、シェルはあらかじめ決められた置き場所だけを探します。今いるディレクトリはそこに含まれていません。含めてしまうと、ls という名前の細工されたファイルが置かれたディレクトリに入っただけで踏んでしまうからです。目の前のファイルを動かすときは ./ を付けて、場所を明示します。
権利を足さずに動かす手もある
ターミナル
bash setup.sh
python3 report.py動かすプログラムのほうを先に書けば、スクリプトは引数として渡されたただのテキストとして読まれるので、実行の権利は要りません。読む権利だけで足ります。他人のリポジトリを一度だけ試したいときや、ファイルの権限を書き換えたくない場面で使えます。
ただしこの形では、シバンの行がただのコメントとして無視されます。中身が Python なのに bash で起動すれば当然エラーになるので、合ったプログラムを自分で選ぶ必要があります。
課題
- chmod +x を使う
- スクリプトを実行して Hello を出力する