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ランナー)間で共有されるスクリプトで特に重要です。

試してみる — Shell Script Linter

フルツールを開く