「作ったスクリプトが実行できない…」
「Permission deniedって何?」
「./script.sh と sh script.sh の違いは?」
Linuxでスクリプトを実行しようとして、こんな壁にぶつかっていませんか?
実は、Linuxでスクリプトを実行するにはいくつかの方法と、知っておくべきルールがあるんです。権限設定から実行方法まで、これを理解すれば、どんなスクリプトもスムーズに動かせるようになります。
この記事を読めば、bashスクリプト、Pythonスクリプト、その他どんなスクリプトも自在に実行できるようになります。Linuxの真の力を解放しましょう!
スクリプト実行の基本:3つの方法

方法1:直接実行(./を使う方法)
最も一般的で、Linuxらしい実行方法です。
基本コマンド:
./script.sh
実行の流れ:
- カレントディレクトリのscript.shを探す
- 実行権限をチェック
- シバン(後述)を読んで適切なインタープリタで実行
なぜ「./」が必要?
# これはエラー
script.sh
# これが正しい
./script.sh
# 理由:セキュリティのため、カレントディレクトリはPATHに含まれない
方法2:インタープリタを指定する方法
実行権限がなくても動かせる方法です。
各言語での実行例:
# Bashスクリプト
bash script.sh
sh script.sh
# Pythonスクリプト
python script.py
python3 script.py
# Perlスクリプト
perl script.pl
# Rubyスクリプト
ruby script.rb
メリット:
- 実行権限が不要
- インタープリタを明示的に指定できる
デメリット:
- 毎回インタープリタを指定する必要がある
- シバンの設定が無視される
方法3:sourceコマンド(現在のシェルで実行)
現在のシェル環境で実行する特殊な方法です。
実行方法:
source script.sh
# または
. script.sh
通常実行との違い:
# 通常実行(子プロセスで実行)
./script.sh
# → スクリプト内の変数は実行後消える
# source実行(現在のシェルで実行)
source script.sh
# → スクリプト内の変数が残る
使いどころ:
- 環境変数の設定スクリプト
- エイリアスの定義
- .bashrcや.profileの再読み込み
実行権限の設定(これが最重要!)
Permission deniedを解決する
スクリプト実行で最も多いエラーがこれです。
エラーの例:
$ ./script.sh
-bash: ./script.sh: Permission denied
解決方法:
# 実行権限を付与
chmod +x script.sh
# これで実行可能に!
./script.sh
chmodコマンドの詳細
基本的な使い方:
# 所有者に実行権限を付与
chmod u+x script.sh
# 全員に実行権限を付与
chmod a+x script.sh
# 数値指定(755 = rwxr-xr-x)
chmod 755 script.sh
権限の意味:
rwxrwxrwx
│││││││││
│││││││└─ 他人の実行権限
││││││└── 他人の書き込み権限
│││││└─── 他人の読み取り権限
││││└──── グループの実行権限
│││└───── グループの書き込み権限
││└────── グループの読み取り権限
│└─────── 所有者の実行権限
└──────── 所有者の書き込み権限
└──────── 所有者の読み取り権限
よく使う権限パターン:
# 自分だけ実行可能
chmod 700 script.sh
# 自分は何でも、他は実行のみ
chmod 755 script.sh
# 自分とグループは実行可、他は不可
chmod 750 script.sh
シバン(Shebang)の正しい書き方
シバンって何?
スクリプトの1行目に書く、インタープリタを指定する特殊な行です。
基本形式:
#!/bin/bash
各言語のシバン例:
#!/bin/bash # Bashスクリプト
#!/bin/sh # POSIX準拠シェル
#!/usr/bin/python3 # Python3
#!/usr/bin/perl # Perl
#!/usr/bin/ruby # Ruby
#!/usr/bin/env python3 # envを使った柔軟な指定
envを使うメリット
通常のシバン:
#!/usr/bin/python3
# → パスが固定
envを使ったシバン:
#!/usr/bin/env python3
# → PATHから探してくれる(柔軟)
使い分け:
- システムスクリプト:絶対パス指定
- ユーザースクリプト:env使用推奨
パスを指定した実行
絶対パスで実行
どこからでも確実に実行できる方法です。
# 絶対パスで実行
/home/user/scripts/script.sh
# ホームディレクトリからの絶対パス
~/scripts/script.sh
相対パスで実行
現在位置からの相対的な指定です。
# 現在のディレクトリ
./script.sh
# 親ディレクトリ
../script.sh
# サブディレクトリ
scripts/script.sh
PATHに追加して実行
よく使うスクリプトはPATHに追加すると便利です。
個人用スクリプトディレクトリの作成:
# ディレクトリ作成
mkdir ~/bin
# PATHに追加(.bashrcに記述)
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
# 反映
source ~/.bashrc
# スクリプトを配置
cp script.sh ~/bin/
chmod +x ~/bin/script.sh
# どこからでも実行可能に!
script.sh
バックグラウンド実行とジョブ管理
バックグラウンドで実行
長時間かかるスクリプトに便利です。
基本的な方法:
# & を付けてバックグラウンド実行
./long_script.sh &
# nohupでログアウト後も継続
nohup ./long_script.sh &
# 出力をファイルにリダイレクト
./script.sh > output.log 2>&1 &
ジョブの管理
ジョブ操作コマンド:
# ジョブ一覧
jobs
# フォアグラウンドに戻す
fg %1
# バックグラウンドに送る
bg %1
# ジョブを終了
kill %1
実行中のスクリプトを操作:
# Ctrl+Z で一時停止
# bg でバックグラウンド再開
# fg でフォアグラウンド再開
スクリプトのデバッグ実行
bashスクリプトのデバッグ
デバッグオプション:
# 実行するコマンドを表示
bash -x script.sh
# 構文チェックのみ
bash -n script.sh
# 変数が未定義ならエラー
bash -u script.sh
# エラーで即終了
bash -e script.sh
スクリプト内でデバッグモード:
#!/bin/bash
set -x # デバッグ開始
echo "Debug mode"
set +x # デバッグ終了
よくあるトラブルと解決法
トラブル1:Command not found
原因と対策:
# 原因:インタープリタが見つからない
$ ./script.sh
-bash: /bin/bsh: bad interpreter: No such file or directory
# 対策:シバンを修正
#!/bin/bash # bashに修正
トラブル2:改行コードの問題
Windows作成ファイルの問題:
# エラー例
$ ./script.sh
-bash: ./script.sh: /bin/bash^M: bad interpreter
# 解決:改行コードを変換
dos2unix script.sh
# または
sed -i 's/\r$//' script.sh
トラブル3:文字コードの問題
UTF-8 BOM付きファイルの問題:
# BOMを削除
sed -i '1s/^\xEF\xBB\xBF//' script.sh
セキュリティに配慮した実行
危険なスクリプトを見分ける
実行前にチェック:
# 内容を確認
cat script.sh
less script.sh
# 危険なコマンドを検索
grep -E "rm -rf|:(){ :|:& };:" script.sh
安全な実行環境
制限付き実行:
# 別ユーザーで実行
sudo -u nobody ./script.sh
# chrootで隔離
chroot /safe/environment ./script.sh
# Dockerコンテナで実行
docker run -it --rm -v $(pwd):/work ubuntu bash /work/script.sh
実用的なスクリプト実行例
定期実行(cron)
crontabへの登録:
# crontab編集
crontab -e
# 毎日3時に実行
0 3 * * * /home/user/scripts/backup.sh
# 5分ごとに実行
*/5 * * * * /home/user/scripts/monitor.sh
起動時実行
systemdサービスとして登録:
# サービスファイル作成
sudo nano /etc/systemd/system/myscript.service
[Unit]
Description=My Script Service
After=network.target
[Service]
Type=simple
ExecStart=/home/user/scripts/script.sh
Restart=always
[Install]
WantedBy=multi-user.target
# 有効化
sudo systemctl enable myscript.service
sudo systemctl start myscript.service
まとめ:スクリプト実行をマスターしよう!
ここまで読んでいただき、ありがとうございました!
今すぐ覚えるべき基本コマンド
- 実行権限の付与
chmod +x script.sh
- 直接実行
./script.sh
- デバッグ実行
bash -x script.sh
実行方法クイックリファレンス
権限がある場合:
./script.sh
権限がない場合:
bash script.sh
環境変数を設定する場合:
source script.sh
バックグラウンド実行:
nohup ./script.sh &
トラブル時のチェックリスト
- [ ] 実行権限はあるか(ls -l)
- [ ] シバンは正しいか(1行目確認)
- [ ] 改行コードは LF か(dos2unix)
- [ ] パスは正しいか(which)
- [ ] 構文エラーはないか(bash -n)
Linuxでのスクリプト実行は、一度理解すれば簡単です。
この記事で学んだ知識を活かして、自動化の世界を楽しんでください。スクリプトを自在に操れるようになれば、Linuxの真の力を引き出せます!
Happy Scripting! 🐧
コメント