在 shebang 中,#!
与口译员之间是否允许有空格或更多空间?
例如,#! /bin/bash
。这似乎可行,但有人说这是不正确的。
答案1
是的,这是允许的。
维基百科文章关于舍邦 包括一封来自 Dennis Ritchie 的 1980 年电子邮件,当时他正在介绍对 shebang 的内核支持(作为更广泛的软件包的一部分,称为解释器指令)进入版本 8 Unix(强调我的):
系统已更改,因此如果正在执行的文件以魔术字符 开头
#!
,则该行的其余部分将被理解为所执行文件的解释器的名称。 […]为了利用这个绝佳的机会,请
#! /bin/sh
位于 shell 脚本第一行的左边距。 后面留空
!
就OK了。
因此,shebang 后面的空格已经存在很长一段时间了,事实上,丹尼斯·里奇的例子正在使用它们。
请注意,早期版本的 Unix 在此解释器行中限制为 16 个字符,因此不能有任意数量的空格。此限制不再适用于现代内核。
答案2
是的, 后允许有空格#!
。甚至有人(错误地)认为某些系统可能需要它,但它始终只是可选的。
如需进一步阅读,请尝试这里
答案3
仅供参考,某些版本的 systemd 无法解析带有空格的 shebang。有了这样的服务:
[Service]
Type=oneshot
ExecStart=/root/foo.sh
...还有像这样的 shebang:
#! /bin/bash
...你可能会收到这样的错误:
systemd[32834]: foo.service: Failed at step EXEC spawning /root/foo.sh: Exec format error
删除 shebang 中的空格可以修复该错误。所以要留意那个。