SC2148: シェルスクリプトのシェバン行の欠落
すべてのシェルスクリプトにシェバン(#!/bin/bash)行が必要な理由。#!/bin/bash、#!/bin/sh、#!/usr/bin/env bashの違いを解説します。
Script Setup
詳細な説明
シェバン行
シェバン(ハッシュバング)はスクリプトの最初の行で、オペレーティングシステムにどのインタプリタを使用するかを指示します。これがないと、動作は呼び出し元のシェルに依存し、予測不能になります。
一般的なシェバン
#!/bin/bash # Bash(絶対パス)
#!/usr/bin/env bash # Bash(ポータブル、PATH検索を使用)
#!/bin/sh # POSIXシェル(dash、ashなどの場合あり)
#!/usr/bin/env sh # POSIXシェル(ポータブル)
#!/bin/zsh # Zsh
なぜ重要か
シェバンがない場合、./script.shを実行すると:
- 現在のシェルをインタプリタとして使用する場合
- 一部のシステムでは
/bin/shを使用する場合 - 完全に失敗する場合
# シェバンなしでは、このBash固有の構文が失敗する可能性:
if [[ $var =~ regex ]]; then
echo "match"
fi
# /bin/sh(dash)で実行すると、[[ は構文エラー
#!/bin/bash vs #!/usr/bin/env bash
| アプローチ | メリット | デメリット |
|---|---|---|
#!/bin/bash |
直接的、高速 | bashが/bin/bashにない場合失敗(NixOS、FreeBSD) |
#!/usr/bin/env bash |
ポータブル、PATHでbashを検索 | わずかに遅い、一部のシステムでフラグを渡せない |
#!/bin/sh vs #!/bin/bash
#!/bin/shを使用する場合、スクリプトはPOSIX準拠である必要があります。Bash固有の機能は使用できません:
| 機能 | POSIX sh | Bash |
|---|---|---|
[[ ]] |
不可 | 可 |
| 配列 | 不可 | 可 |
${var//pattern/replace} |
不可 | 可 |
functionキーワード |
不可 | 可 |
プロセス置換 <() |
不可 | 可 |
ベストプラクティス
Bash機能を使用するスクリプトには#!/usr/bin/env bashを使用し、POSIX準拠を確認した場合のみ#!/bin/shを使用してください。
ユースケース
作成または配布するすべてのシェルスクリプト。異なるシステム(Linuxディストリビューション、macOS、CI/CDランナー)間で共有されるスクリプトで特に重要です。