実行権限とスクリプト

実行権限とスクリプト とは

シェルスクリプト実行に必須の実行権限について解説。設定方法と注意点をターミナルで確認します。本レッスンでは、実行権限とスクリプト の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

Linux では、シェルスクリプトや Python スクリプトを ./script.sh の形で直接実行するには 実行権限 (x) が必要です。GitHub からダウンロードした起動スクリプトが Permission denied で動かない、CI で生成した bash ファイルを実行しようとして失敗する。こうした場面の解決策はほとんどが chmod +x の一発です。本レッスンでは実行権限を付与してスクリプトを動かすまでの一連の流れを実習します。

ファイル実行の 3 つの条件

diagram (will load when visible)

3 つそろわないと実行できない、というのを意識すると詰まったときに切り分けが速くなります。

shebang とは

スクリプト 1 行目の #! で始まる行を shebang (シバン)と呼び、どのインタプリタで実行するかを OS に教える役割があります。

ターミナル

#!/bin/bash # bash で実行 #!/usr/bin/env python3 # 環境の PATH から python3 を探して実行 #!/usr/bin/env node

/usr/bin/env 経由にしておくと、システムによってインタプリタの場所が違う場合に対応しやすくなります。

chmod +x で実行権限を付ける

ターミナル

$ chmod +x script.sh # 全員に実行権限を追加(u+x g+x o+x と同じ) $ chmod u+x script.sh # 所有者だけに付与(より安全) $ chmod 755 script.sh # 8 進数で一気に指定

所有者だけ実行できれば十分なケースが多いので、本番では u+x750 を使うことも増えます。一般的なスクリプトでは 755 がもっとも一般的です。

./ で実行する理由

ターミナル

$ script.sh # PATH 上にないと command not found $ ./script.sh # カレントディレクトリのファイルを明示的に指定

セキュリティ上の理由でカレントディレクトリ . は PATH に含まれていないので、現在地のスクリプトは ./ プレフィックスで呼びます。

実例

ターミナル

$ cat > hello.sh <<'EOF' #!/bin/bash echo "Hello from script!" EOF $ ls -l hello.sh -rw-r--r-- 1 user user 41 May 20 hello.sh $ ./hello.sh bash: ./hello.sh: Permission denied $ chmod +x hello.sh $ ./hello.sh Hello from script!

権限を付ける前は Permission deniedchmod +x 後は実行できる、という典型的な流れです。

ディレクトリの実行権限

ディレクトリにおける x は「中に入る権限」を意味します。r だけだとファイル一覧は取れますが、個別のファイルにはアクセスできません。逆に x だけあれば、名前を知っていればファイルにアクセスできます。

bash 経由で逃げる手もある

実行権限を付けたくないとき、または付ける権限がないときは、インタプリタを明示する方法もあります。

ターミナル

bash script.sh python3 script.py node script.js

この場合 x は不要で r(読み取り権限)だけあれば動きます。一時的なデバッグや、CI でファイルパーミッションをいじりたくない場面で重宝します。

「Permission denied になったら chmod +x、それでもダメなら shebang を確認、それでもダメならインタプリタの場所を確認」これを身体で覚えると現場で詰まらなくなります。

スクリプトを PATH に置く

よく使うスクリプトは ~/bin/usr/local/bin のような PATH 上のディレクトリに置くと、./ を付けずにファイル名だけで実行できます。

ターミナル

# ~/bin を作って PATH に追加 mkdir -p ~/bin echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc source ~/.bashrc # スクリプトを配置 cp hello.sh ~/bin/hello chmod +x ~/bin/hello # どこからでも hello で呼べる hello

拡張子 .sh を外しておくと、シェルスクリプト感がなくなり「自分専用コマンド」として馴染みます。

改行コードに注意

Windows で編集したスクリプトを Linux に持っていくと、改行が CRLF のまま残って bad interpreter: No such file or directory というエラーになることがあります。原因は shebang 行の末尾に余計な \r が付くからです。

ターミナル

# 改行を LF に変換 sed -i 's/\r$//' script.sh # または dos2unix script.sh

VS Code や Cursor を使う場合、エディタ右下の改行コード表示で LF になっていることを確認してから保存してください。CRLF のまま push すると CI が動かない事故の原因になります。

バイナリ実行ファイルとの違い

diagram (will load when visible)

C や Go で作ったコンパイル済みバイナリも chmod +x で実行可能になりますが、内部処理はスクリプトと違って「カーネルが直接 ELF を解釈する」流れです。どちらにせよ x 権限の有無は共通の入り口なので、Permission denied への対処は同じです。

まとめ

  • スクリプト実行には x 権限が必須
  • chmod +x で全員、chmod u+x で所有者だけに付与
  • ./script.sh./ はカレントディレクトリの明示
  • shebang でインタプリタを指定
  • 権限を付けたくないときは bash script.sh で呼ぶ手もある
  • Windows 改行 CRLF が原因のエラーは sed か dos2unix で対処
  • バイナリも仕組みは違うが x 権限の必要性は同じ

次のレッスン

次は パーミッションチェック で、シェルスクリプト実行に必須の実行権限について解説 を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 実行権限とスクリプト の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 実行権限とスクリプト とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. chmod +x を使う
  2. スクリプトを実行して Hello を出力する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力