CentOS7.4 シェルスクリプトで指定するシェバング

シェアする

シェルスクリプトを作る時に指定するシェバングですが、bashの文法を積極的に利用したい場合は、「#!/usr/bin/bash」と書くようにしています。

#!/usr/bin/bashを書く理由

よく見かけるのは、「#!/bin/bash」という書き方ですが、このパスは、「/bin」が「usr/bin」にシンボリックリンクになっているので、実体のファイルを指し示していません。ですので、実体ファイルがあるパスの指定が好ましいと思います。

# which bash
/bin/bash
# ls -l /bin/bash
-rwxr-xr-x. 1 root root 960392 Jul 13  2016 /bin/bash
# ls -l /usr/bin/bash
-rwxr-xr-x. 1 root root 960392 Jul 13  2016 /usr/bin/bash
# ls -l /bin
lrwxrwxrwx. 1 root root 7 Jul 12  2017 /bin -> usr/bin <= シンボリックリンク

次によく見かけるのは、「#!/usr/bin/sh」という書き方ですが、bashの文法を積極的に使いたい場合は、避けるべきです。

# ls -l /usr/bin/sh
lrwxrwxrwx. 1 root root 4 Jul 12  2017 /usr/bin/sh -> bash <= シンボリックリンク
# vim /tmp/sample.sh
#!/usr/bin/sh
set -o | grep posix
# /tmp/sample.sh
posix           on   <= POSIXが有効
# vim /tmp/sample.bash
#!/usr/bin/bash
set -o | grep posix
# /tmp/sample.bash
posix           off  <= POSIXが無効

「man bash」を見ていると、下記のようなことが書いていました。「できるだけ」って文言が引っかかりますが、、、

# man bash
   : (省略)
shという名前でbashを起動すると、bashは古くからあるshの起動動作をできるだけ真似しようとします。
またPOSIX標準にもできるだけ従おうとします。
   : (省略)

ということで、特に理由がないのであれば、「#!/usr/bin/bash」を指定するのが良いでしょう。