22531


シェルスクリプトに指定される shebang が、

[code]

    #! /bin/sh
    
[/code]

のように、 ! マークとインタプリターの間にスペースが挿入されているケースをたびたび見かけます。

[code]

    #!/bin/sh
    
[/code]

の形式ではなく、このようにスペースをいれて shebang を記述する特別な理由はありますか。


CC BY-SA 3.0
2016-02-25T03:36:55.027
22507
2023-06-18T22:20:23.337
754
question
unix
#! /bin/sh で、 ! の後にスペースを空けることに理由はあるか


@user10685さんのコメントの[関連リンク](https://stackoverflow.com/questions/10197690/perl-
shebang-space)とそこから辿れる情報で大体出尽くしている感がありますが、私も以前はスペースを入れていました。これは、GNU
autoconfのチュートリアルに「4.2BSDでは先頭4バイト"#!
/"をマジックナンバーとして読むのでスペースが必要」と[あったからです。](http://web.archive.org/web/20080118164924/http://www.gnu.org/software/autoconf/manual/autoconf-2.57/html_chapter/autoconf_10.html)これは誤りで実際は[空白はオプショナル](http://www.in-
ulm.de/~mascheck/various/shebang/#blankrequired)であり、新しい版では直っています。

質問の「理由」は、かつての私にとっては「autoconfのチュートリアルに書いてあったから」となります。同様の理由でスペースを入れてる人も多いんじゃないでしょうか。


CC BY-SA 3.0
2016-02-25T07:50:39.050
22531
2016-02-25T07:50:39.050
2017-05-23T12:38:56.083
-1
5258
22507
answer


shirokさんおっしゃる、関連のリンクの一つ <http://www.in-ulm.de/~mascheck/various/shebang/>
のBlank after #! required?の拙訳です。

>
> 「初期のUnixの極一部のある特別なバージョン(特に4.2BSD由来のもの)では"#!"はそれに続くパスとの間にスペースを必要とする」という噂がある。「カーネルは"#!
> /"を32bit(long
> int)としてファイルマジックをパースする」という(真偽不明の)記述さえ読んだことがあるかもしれない。しかし、本当にスペースを必要とするUnixは事実上存在しないことがわかった。
>
> 以前のバージョンのGNU
> autoconfチュートリアルではスペースが必要と誤記されているが、事実は4.2BSDでは不要だ。("10.どこでも動くシェルプログラム"は2009年7月26日のリリース2.64で訂正された)。それよりも[4.2BSD,/usr/src/sys/sys/kern_exec.c](http://www.in-
> ulm.de/~mascheck/various/shebang/42bsd_kern_exec.c.html)を見てください(最初の出現箇所)。スペースは受け付けられるが、必須ではない。これらの事実はすべてGunnar
> Ritterによって指摘された。(Caldera Unixの新しいライセンスにより現在はコードを引用することが可能になった）。
>
> それよりも、この噂の出所は特定のリリースの4.1 BSDかもしれない。CSRG
> CDの4.1BSDのスナップショット"4.1snap"のMANページ[/usr/man/man2/exec.2](http://www.in-
> ulm.de/~mascheck/various/shebang/4.1BSD.snap.exec.2.html)
> (1981年4月1日付)では#!の後にスペースまたはタブが必須とある。しかしながらこの記述は真実ではない。先のソースコード自体に変更はないのだから。(MANページの存在のヒントはBruce
> Barnettより)
>
> ドキュメントの混乱なのか、バークレーがBSDのソースの変更を予定していたが結局しなかったのかははっきりしない。
>
>
> autoconfのドキュメントではDYNIXについても言及されている。この亜種が(このMANページに従って）それを実装したのかもはっきりしていない。[Dynix
> 3.2.0](http://www.in-
> ulm.de/~mascheck/various/shebang/Dynix-3.2.0-kern_exec.c.html)と[Dynix PTS
> 1.2.0](http://www.in-ulm.de/~mascheck/various/shebang/Dynix-
> PTX-1.2.0-kern_exec.c.html)は実際4.2BSDの派生で、スペースは不要である。
>
> autoconfのドキュメントの著者であるDavid
> McKenzieに例の記述の本当の出所を聞いたが、残念ながら報告者もそのシステムについても記録がもう存在しない。
>
> USENETのアーカイブも徹底的に調べたがこれ以上のヒントは見つからなかった。

[訳注]Unixの歴史は面白いので僕自身実際のソースをGitHubで見てみました。なぜこの記事では4.2BSDを参照したのかわかりませんが、4.1でも同じ実装です。

<https://github.com/dspinellis/unix-history-repo/blob/BSD-4_1_snap-Snapshot-
Development/sys/sys/sys1.c#L127>

#!は次のコミットで追加されました。execのMANページは5/9に追加みたいです。

[code]

    Author: Robert Elz <kre@ucbvax.Berkeley.EDU>
    Date:   Wed Jan 28 20:02:27 1981 -0800
    
        #! execs
    
[/code]

BSD4には#!は存在しませんでした。  
<https://github.com/dspinellis/unix-history-repo/blob/BSD-4-Snapshot-
Development/usr/src/sys/sys/sys1.c>


CC BY-SA 4.0
2016-02-28T06:58:26.833
22623
2019-01-30T02:17:35.683
2019-01-30T02:17:35.683
3060
7837
22507
answer