こんにちは、かつコーチです。
前回は、シェルスクリプトがコマンドをまとめて自動実行する仕組みであることを解説しました。
サンプルの中で、1行目にさらっと書いた#!/bin/bashが気になった方も多いと思います。
今回は、この記述の正体と、実行に欠かせない実行権限について詳しく見ていきます。
この記事を読めば、スクリプトが「動く」までに何が起きているかを正しく理解できます。
シェバンと実行権限とは?
シェバン:どのプログラムで実行するかを指定する宛先ラベル
シェバンとは、スクリプトファイルの1行目に書く#!で始まる特殊な記述で、「このファイルをどのプログラムで実行するか」をOSに伝える役割を持ちます。
荷物を送るときに書く宛先ラベルをイメージしてください。
ラベルがなければ荷物がどこに届くか分からないように、シェバンがなければOSは「このファイルをどう解釈すればいいか」判断できません。
#!/bin/bash
この1行は、「このスクリプトはbashで実行してください」という宛先指定にあたります。
実行権限:ファイルを実行してよいという鍵
実行権限とは、そのファイルを「プログラムとして動かしてよい」ことを示す許可のことです。
Linuxのファイルには、読み取り(r)・書き込み(w)・実行(x)という3種類の権限があり、実行権限がないファイルはたとえ中身が正しいスクリプトでも動かせません。
家の鍵をイメージすると分かりやすく、中に何が置いてあっても、鍵(実行権限)がなければドアは開けられません。
基本の書き方・実行手順
手順1:シェバンを正しく書く
シェバンは、必ずファイルの1行目、先頭から書く必要があります。
#!/bin/bash
echo "bashで実行されています"
空白や改行を1行目より前に入れてしまうと、シェバンとして認識されなくなるので注意してください。
bashの絶対パスが環境によって違う場合に備えて、次のようにenv経由で指定する書き方もよく使われます。
#!/usr/bin/env bash
echo "env経由でbashを指定"
envは「今の環境でbashがどこにあるか」を探して実行してくれるため、環境が異なるサーバー間で共有するスクリプトに向いています。
手順2:ファイルの権限を確認する
現在の権限はls -lで確認できます。
ls -l hello.sh
-rw-r--r-- 1 katsu katsu 45 Sep 8 10:00 hello.sh
先頭の-rw-r--r--のうち、x(実行権限)がどこにもないことが分かります。
手順3:chmodで実行権限を付与する
実行権限を付けるにはchmodコマンドを使います。
chmod +x hello.sh
ls -l hello.sh
-rwxr-xr-x 1 katsu katsu 45 Sep 8 10:00 hello.sh
-rwxのようにxが加わったのが確認できます。
これで./hello.shとして実行できるようになります。
よくあるつまずきポイント:「Permission denied」で止まった話
私が新人の頃、サーバー移行作業で他の人が書いたスクリプトを実行しようとして、次のエラーで止まったことがあります。
❌ Before:実行権限を付けずに実行する
./deploy.sh
bash: ./deploy.sh: Permission denied
原因はシンプルで、git cloneで取得したファイルには実行権限が付いていなかったことでした。
中身のコードは正しいのに、権限がないというだけで「動かないバグだ」と30分近く勘違いしていたのを覚えています。
✅ After:chmodで実行権限を付けてから実行する
chmod +x deploy.sh
./deploy.sh
一言に「動かない」と言っても、原因は構文エラーだけとは限らず、権限不足であることも多いです。
エラーが出たら、まずls -lでxが付いているか確認する癖をつけると、無駄な調査時間を減らせます。
応用・一歩先の使い方
権限を数字で指定する
chmodは+xのような記号だけでなく、数字(8進数)でも指定できます。
chmod 755 hello.sh
7(所有者:読み書き実行)、5(グループ:読み実行)、5(その他:読み実行)という組み合わせで、実行スクリプトによく使われる権限です。
数字指定は一見難しく見えますが、「所有者は全部OK、他は実行だけOK」のようにまとめて指定できるので、複数ファイルに同じ権限を設定する場面で重宝します。
bash以外を指定する場面
シェバンはbash以外にも、#!/usr/bin/python3や#!/bin/shなど、実行したい言語に応じて自由に指定できます。
同じ.shという見た目でも、シェバンによって中身の解釈がまったく変わる点は覚えておくと役立ちます。
まとめ
この記事のポイント
- シェバン(
#!/bin/bash)は、どのプログラムで実行するかを示す宛先ラベル - 実行権限がないファイルは、中身が正しくても実行できない
chmod +x(またはchmod 755)で実行権限を付与する- 「Permission denied」が出たら、まず
ls -lで権限を確認する
次に読むべき記事
次回は、スクリプトの中で値を保存・再利用するための「変数」の使い方を解説します。
→ 次の記事:変数の使い方:宣言・展開・クォーティング
タグ: Shell, 初心者向け, 入門