Linuxスクリプト実行完全ガイド!権限設定からトラブル解決まで徹底解説

Linux

「作ったスクリプトが実行できない…」
「Permission deniedって何?」
「./script.sh と sh script.sh の違いは?」

Linuxでスクリプトを実行しようとして、こんな壁にぶつかっていませんか?

実は、Linuxでスクリプトを実行するにはいくつかの方法と、知っておくべきルールがあるんです。権限設定から実行方法まで、これを理解すれば、どんなスクリプトもスムーズに動かせるようになります。

この記事を読めば、bashスクリプト、Pythonスクリプト、その他どんなスクリプトも自在に実行できるようになります。Linuxの真の力を解放しましょう!


スポンサーリンク

スクリプト実行の基本:3つの方法

方法1:直接実行(./を使う方法)

最も一般的で、Linuxらしい実行方法です。

基本コマンド:

./script.sh

実行の流れ:

  1. カレントディレクトリのscript.shを探す
  2. 実行権限をチェック
  3. シバン(後述)を読んで適切なインタープリタで実行

なぜ「./」が必要?

# これはエラー
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

まとめ:スクリプト実行をマスターしよう!

ここまで読んでいただき、ありがとうございました!

今すぐ覚えるべき基本コマンド

  1. 実行権限の付与
   chmod +x script.sh
  1. 直接実行
   ./script.sh
  1. デバッグ実行
   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! 🐧

コメント

タイトルとURLをコピーしました