シバン(shebang)は.bashrc, .zshrc等に必要なのか否か?

3 min read読了の目安(約2900字

シバン(shebang)は.bashrc, .zshrc等に必要なのか否か?

最近シェルスクリプトを書いているときに、(シバン)shebangの必要性を実感し、
.bashrcや.zshrcなどのdotfilesを書いているときに、ふと、.bashrcや.zshrcには一般的にシバン(shebang)は必要ないのか必要なのか? 気になったのでその考察メモ。

※個人的な考察なので、間違い等がありましたら議論や、ご指摘等いただけると幸いです。

シバン(shebang)とは?

shebangの#!の意味は難しいです。(私も現在勉強中です)
これはコメントではないのです。

先に結論だけを言えば、Magic numbersのことです。

asciiコードを16進数に変換しても同じようにコマンドは実行できるということを考えるとイメージができるかもしれません。

#!/bin/bash
ls
eval $'\x23\x21\x2F\x62\x69\x6E\x2F\x62\x61\x73\x68'
eval $'\x6c\x73'

そう、Magic numbers とはこの 0x23 0x21 のことです。これはそれぞれ # ! を表しています。

以下を実行してみると理解できるはずです。

echo -e '\x23'
echo -e '\x21'

※もう少し、このMagic numberやシバンの本質的な役割等を理解できたら追記したいと思います。

ここで、また別の疑問も浮かんでいます。

そもそもなぜシバン(shebang)というのでしょう、全くイメージが湧きません。

これは、shebangというのがスラングのようなもので、実際の意味はSituationだと思われます。[1]

シバン(Shebang)はシチュエーション(Situation)のスラングなんだと思うと、何だか急にイメージできませんか。

また、なぜシバン(shebang)を書かなければいけないのかというと、

You can have scripts without the shebang. In this case the shell that you launch the script from will be used to interpret the script. This can, obviously, lead to complications, on other systems or with other users.
A shebang looks like this: [2]

#!/bin/bash

とあります。
もちろんシバン(shebang)がなくても、スクリプトを作成、実行はできるということですね。

ではなぜシバン(shebang)が必要なのでしょうか。

この場合、スクリプトを起動するシェルがスクリプトの解釈に使用されるということです。

ただ、お分かりのように、これは明らかに、他のシステムや他のユーザとの間で複雑になる可能性があります。

実際にやってみると以下のように、zshのみにしかサポートされてない構文に対してエラーが出ます。

まず、.zshrcをコピーして、shebangをそれぞれ/bin/zsh/bin/shにして検証してみます。

コピーしたzshrcにshebangを加えてみる。

#!/bin/zsh
# shebang->zsh
echo hoge
# 不要なので省略
fpath=(~/.zsh/completion $fpath)
autoload -Uz compinit && compinit -i
zstyle ':completion:*:default' list-colors ${(s.:.)LSCOLORS}
# 以下不要なので省略
#!/bin/sh
# shebang->sh
echo hoge
# 不要なので省略
fpath=(~/.zsh/completion $fpath)
autoload -Uz compinit && compinit -i
zstyle ':completion:*:default' list-colors ${(s.:.)LSCOLORS}
# 以下不要なので省略
$ which zsh
$ which sh
$ cp .zshrc zshrc
$ chmod 755 zshrc
$ ./zshrc

スクリーンショット 2021-04-23 22.49.06.png

ここで、そうなんです、実行権限を与えて、そのまま実行されるとシバンが読まれるようです。

次に、実際に.zshrcに直接#!/bin/shを記述しても、特に変わりなくロードされて、問題なく使用できます。
スクリーンショット 2021-04-23 23.02.16.png

このように記述して、ターミナルを再起動しても、シバンが読まれることはありませんでした。

ここまでの、検証の結果、今回私の結論としては.bashrcや.zshrcにシバン(shebang)を記述することは、無駄なリソースなので、必要ないと判断しました。

最後に

同じような疑問を記事等にしているものを見つけられなかったので今回記事にしてみました。
私の周りにも、.zshrcや.bashrcなどのdotfilesにもシバン(shebang)は書くべきだという人もいれば、書かなくてもいいという人もいて様々だったので、今回考察をしてみました。

もし、「いや私はシバンを書くべきだ」とか、「確かにシバンは書かなくてもいい」など、意見がありましたらコメント等いただけると幸いです。
私自身、未熟なので、間違い等発見されましたら同様にコメントにて教えていただけると幸いです!

脚注
  1. Shebang meaning https://www.yourdictionary.com/shebang/ ↩︎

  2. On the Shebang https://scriptingosx.com/2017/10/on-the-shebang/ ↩︎