可执行的 shebang 脚本是否总是需要 LF 行结尾?

可执行的 shebang 脚本是否总是需要 LF 行结尾?

在 Stack Overflow 上发表评论PowerShell Core 可以在 Linux 环境中处理带有 CRLF 行结尾的 ps1 文件吗?断言使用 shebang 的可执行文件必须仅使用 LF 行结尾,基于引用奥莱利的书。轶事证据在这里shebang 线无法与 cr-lf 配合使用似乎证明了这一点。

但这是官方的 *nix 要求,还是仅在一个平台上的行为?它记录在某处吗?当然没有办法解决它(例如,#在行结束之前添加额外的内容)?

这意味着,如果 PowerShell 脚本打算跨平台使用,则它们将被限制为 LF 行结尾(最新的 PowerShell 现在可以实现)。看PowerShell 脚本最好也有一个 shebang 吗?在这里,还有如何在 PowerShell 脚本中使用 shebang?在堆栈溢出上。

答案1

POSIXly,换行符是唯一的换行符。

话又说回来,hashbang 行不是由 POSIX 指定的,甚至不同的 POSIXy 和 Unixy 系统之间的实现也存在差异,因此某些旨在兼容 Windows 的系统可能会专门处理它们。 (我已经很久没有尝试过了,但我的印象是 Cygwin 至少曾经做过一些 CRLF 修复。在某种程度上,不一定是这样。)

(然后是 Perl 解释器,它处理 hashbang 行本身,以防内核没有。)

一般来说,不,您不能依赖使用 an#作为注释标记来阻止 CR。例如在 Linux 上,有这样的 hashbang 行

#!/bin/bash#[CR]

只会bash使用单个参数(加上文件名)运行,可能会给您一个“文件未找到”错误。#[CR]

但它确实可以在某些系统上运行,比如我的 Mac...参见https://www.in-ulm.de/~mascheck/various/shebang/查看不同系统之间 hashbang 处理差异的表格。

答案2

POSIX 定义(https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html

3.403 文本文件

包含组织成零个或多个字符的文件线。这些行不包含 NUL 字符,且长度不能超过 {LINE_MAX} 个字节,包括 <newline> 字符。尽管 POSIX.1-2017 不区分文本文件和二进制文件(请参阅 ISO C 标准),但许多实用程序在操作文本文件时仅产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其 STDIN 或 INPUT FILES 部分中指定“文本文件”。

3.206线

零个或多个非 <newline> 字符加上终止 <newline> 字符的序列。

回车不是行结尾的一部分:它是“非<换行>字符”。

相关内容