問題: 「bash: ./script.sh: Permission denied」
苦労して便利なBashスクリプトを書き、保存し、いざ実行しようとしました。しかし、スクリプトが実行される代わりに、ターミナルは次のような不満なメッセージを返します。
bash: ./script.sh: Permission denied
このエラーは、特にLinux初心者や、異なるシステム間でスクリプトを移動する際によく発生します。本質的に、これはオペレーティングシステムが必要なパーミッションがないため、スクリプトの実行をブロックしていることを意味します。
TL;DR: 簡単な修正
ほとんどの場合、このエラーはスクリプトに重要な実行権限がないために発生します。問題を解決する最も速い方法は次のとおりです。
- 実行権限を付与します:
chmod +x script.sh
- スクリプトを実行します:
./script.sh
これでうまくいけば、素晴らしいです!準備完了です。もしそうでなくても心配しないでください。より詳細な説明と他の潜在的な解決策については、引き続きお読みください。
「Permission denied」の理解
Linuxや同様のUnix系オペレーティングシステムでは、ファイルパーミッションはそのセキュリティモデルの核となる部分です。各ファイルとディレクトリには、誰が読み取り、書き込み、または実行できるかを規定する特定のパーミッションがあります。スクリプトに対して「Permission denied」と表示される場合、それはスクリプトを実行しようとしているユーザーがそのファイルに対する重要な実行権限を持っていないことを具体的に示しています。
./script.shを使用してスクリプトを実行しようとすると、シェルに直接実行を指示しています。オペレーティングシステムは、そのファイルにユーザーまたはグループの「実行」ビットが有効になっているかを確認します。そのビットが欠落している場合、「Permission denied」エラーが表示されます。
この状況は、いくつかの理由で頻繁に発生します。
- 自分でスクリプトを作成した場合。デフォルトでは、多くのシステムは新しく作成されたファイルに実行権限を自動的に割り当てません。
- Windowsシステムやウェブサイトなどの外部ソースからスクリプトをダウンロードまたはコピーした場合。これらの場合、ファイルパーミッションが正しく転送されないことがあります。
ステップバイステップの解決策
方法1: chmodで実行権限を追加する
これは多くの場合、最も簡単で直接的な修正です。chmodコマンド(「change mode」の略)は、ファイルパーミッションを変更するための頼りになるツールです。
1. 現在のパーミッションを確認する
変更を加える前に、ls -lを使用してスクリプトの現在のパーミッションを検査することをお勧めします。
ls -l script.sh
次のような出力が表示されます。
-rw-r--r-- 1 user user 1234 Mar 16 10:00 script.sh
確認すべき重要な部分は-rw-r--r--です。これらの文字が何を意味するのかを分解してみましょう。
- 最初の文字 (
-) は、それが通常のファイルであることを示します (dはディレクトリを意味します)。 rw-: ファイルの所有者 (user) は読み取りと書き込みができますが、実行権限がありません。r--: 所有グループのメンバー (この例ではuserも) は読み取りができますが、書き込みや実行はできません。r--: その他のすべてのユーザーは読み取りができますが、書き込みや実行はできません。
所有者の「x」(実行)がないことに注目してください。これがエラーに遭遇しているほぼ確実な理由です。
2. 実行権限を付与する
ファイルの所有者(通常はあなた自身)にのみ実行権限を追加するには、このコマンドを使用します。
chmod +x script.sh
+xオプションは実行権限を追加します。すべての人(所有者、グループ、その他)に実行権限を付与する必要がある場合は、chmod a+x script.shまたは8進モードのchmod 755 script.shを使用できます。例えば、755は所有者に読み取り/書き込み/実行権限を付与し、グループとその他のユーザーには読み取り/実行権限を付与します。
3. パーミッションを確認する
変更を確認するために、ls -lをもう一度実行します。
ls -l script.sh
これで次のように表示されるはずです。
-rwxr--r-- 1 user user 1234 Mar 16 10:00 script.sh
「rw」の後の「x」文字は、所有者が実行権限を持っていることを確認します。
4. スクリプトを実行する
実行権限が正しく設定されたので、問題なくスクリプトを実行できるようになりました。
./script.sh
方法2: インタープリタで明示的に実行する
スクリプトに実行権限がなくても、シェルにどのインタープリタを使用するかを直接指示することで実行できることがよくあります。この方法は、インタープリタ(例:bash)自体を実行し、スクリプトをその引数として渡すため機能します。インタープリタはすでに実行権限を持っているため、スクリプトの内容を読み取って処理できます。
1. bashを使用する
bash script.sh
このコマンドは、システムにbashインタープリタを使用してscript.shを実行するように指示します。このシナリオでは、bashが実行を処理するため、スクリプトファイル自体に実行権限は必要ありません。
2. shを使用する(POSIX準拠スクリプトの場合)
sh script.sh
bashを使用するのと同様に、このアプローチはデフォルトシェル(しばしばbashまたはdashにリンクされています)を使用してスクリプトを実行します。
この方法はスクリプトを効果的に実行させますが、./script.shを使用してスクリプトを直接実行するつもりであれば、実行権限を付与するのが一般的なベストプラクティスです。
方法3: chownでファイルの所有権を修正する
このシナリオは、基本的な「permission denied」エラーではあまり一般的ではありません。しかし、スクリプトの現在の所有者がそれを実行しようとしているユーザーではなく、そのユーザーが十分なグループまたは「その他」のパーミッションを持っていない場合には、非常に関連性があります。chownコマンド(所有者の変更)は、ファイルの所有者および/またはグループを変更することを可能にします。
1. 所有者とグループを確認する
もう一度ls -l script.shを使用してください。所有者とグループをそれぞれ表示する3番目と4番目の列に注意してください。
-rwxr--r-- 1 **otheruser** **othergroup** 1234 Mar 16 10:00 script.sh
2. 所有権を変更する
youruserとしてログインしているが、スクリプトがotheruserによって所有されている場合、所有権を変更する必要がある可能性が高いです。このアクションには通常、sudo権限が必要です。
sudo chown youruser:yourgroup script.sh
youruserとyourgroupを実際のユーザー名とプライマリグループに置き換えることを忘れないでください。所有権を変更した後、方法1で説明したように、実行権限が正しく設定されていることを確認してください。
方法4: 親ディレクトリのパーミッションを確認する
場合によっては、問題がスクリプト自体ではなく、スクリプトが配置されているディレクトリにあることがあります。そのディレクトリを一覧表示したりアクセスしたりするのに必要なパーミッションがない場合、その中に含まれるスクリプトを実行することはできません。
1. ディレクトリのパーミッションを確認する
スクリプトを含むディレクトリのパーミッションを検査します。
ls -ld .
パーミッション文字列の先頭にある「d」は、それがディレクトリであることを確認します。ディレクトリの場合、「実行」パーミッションは不可欠です。これにより、ディレクトリにcdしてその内容にアクセスできます。
2. ディレクトリのパーミッションを付与する(必要な場合)
ディレクトリのパーミッションが厳しすぎる場合(例:「その他」または特定のグループに対して---r--r--)、読み取りおよび実行パーミッションを追加する必要があるかもしれません。
chmod o+rx .
または、特定のグループにパーミッションを付与する必要がある場合:
chmod g+rx .
ディレクトリのパーミッションを変更する際は、特に共有環境では、他のユーザーに影響を与える可能性があるため、常に注意してください。
確認: 修正の確認
これらの解決策のいずれかを適用した後、特に方法1の後には、必ず変更を確認するために少し時間を取ってください。
- ファイルパーミッションを再確認します:
ls -l script.sh
「x」(実行)ビットが正しいユーザーまたはグループに存在することを確認します。
- スクリプトをもう一度実行します:
./script.sh
スクリプトが「Permission denied」エラーなしで正常に実行され、意図したタスクを実行した場合、修正が確認されたことになります!
参考文献とリソース
man chmod: ファイルパーミッションの変更に関する詳細を深く掘り下げます。man chown: ファイルの所有権の変更についてさらに学びます。- Linuxファイルパーミッションの包括的なガイド: 「rwx」システムと755や644のような8進モードを理解します。

