此答案是对技术答案而非意见的尝试。
如果我们想成为 POSIX 纯粹主义者,我们将一行定义为:
零个或多个非 字符加上一个终止 字符的序列。
来源:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206
不完整的行为:
文件末尾的一个或多个非 字符序列。
来源:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_195
文本文件为:
包含组织成零行或多行的字符的文件。这些行不包含 NUL 字符,长度不能超过 {LINE_MAX} 个字节,包括 字符。尽管 POSIX.1-2008 不区分文本文件和二进制文件(参见 ISO C 标准),但许多实用程序仅在对文本文件进行操作时产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其 STDIN 或 INPUT FILES 部分中指定“文本文件”。
来源:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_397
一个字符串为:
由第一个空字节终止并包括第一个空字节的连续字节序列。
来源:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_396
因此,我们可以得出,我们可能遇到任何类型问题的唯一时间是我们处理文件的行的概念或文本文件的文件(即文本文件是零行或多行的组织,我们知道一行必须以结束)。
恰当的例子:wc -l filename。
我们从wc的手册中读到:
行定义为由 字符分隔的字符串。
如果它们是 text 文件,那么对 JavaScript、HTML 和 CSS 文件有何影响?
在浏览器、现代 IDE 和其他前端应用程序中,在 EOF 跳过 EOL 没有问题。应用程序将正确解析文件。它必须因为并非所有操作系统都符合 POSIX 标准,因此非操作系统工具(例如浏览器)根据 POSIX 标准(或任何操作系统级标准)处理文件是不切实际的。
因此,我们可以相对确信 EOF 的 EOL 对应用程序级别几乎没有负面影响 - 无论它是否在 UNIX 操作系统上运行。
此时我们可以自信地说,在客户端处理 JS、HTML、CSS 时,在 EOF 处跳过 EOL 是安全的。实际上,我们可以说缩小这些文件中的任何一个,不包含 是安全的。
我们可以更进一步说,就 NodeJS 而言,它也不能遵守 POSIX 标准,因为它可以在不符合 POSIX 的环境中运行。
那我们还剩下什么?系统级工具。
这意味着可能出现的唯一问题是工具努力使其功能符合 POSIX 语义(例如,wc 中所示的行定义)。
即便如此,并不是所有的 shell 都会自动遵守 POSIX。例如,Bash 不默认为 POSIX 行为。有一个开关可以启用它:POSIXLY_CORRECT。
关于 EOL 的价值是 值得深思:https://www.rfc-editor.org/old/EOLstory.txt
为了所有实际意图和目的,留在工具轨道上,让我们考虑一下:
让我们使用没有 EOL 的文件。在撰写本文时,此示例中的文件是没有 EOL 的缩小 JavaScript。
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o x.js
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o y.js
$ cat x.js y.js > z.js
-rw-r--r-- 1 milanadamovsky 7905 Aug 14 23:17 x.js
-rw-r--r-- 1 milanadamovsky 7905 Aug 14 23:17 y.js
-rw-r--r-- 1 milanadamovsky 15810 Aug 14 23:18 z.js
请注意,cat 文件大小恰好是其各个部分的总和。如果 JavaScript 文件的连接是 JS 文件的关注点,那么更合适的关注点是每个 JavaScript 文件都以分号开头。
正如该线程中的其他人所提到的:如果你想cat 两个文件的输出变成一行而不是两行怎么办?换句话说,cat 做了它应该做的事情。
cat 的 man 只提到读取输入到 EOF,而不是 。请注意,cat 的 -n 开关也将打印出非 终止行(或 incomplete line)作为 line - 这是计数从 1 开始(根据man。)
-n 为输出行编号,从 1 开始。
现在我们了解了 POSIX 如何定义 line ,这种行为变得模棱两可,或者说真的不合规。
了解给定工具的用途和合规性将有助于确定以 EOL 结束文件的重要性。在 C、C++、Java (JAR) 等中...一些标准将规定换行符以表示有效性 - JS、HTML、CSS 不存在这样的标准。
例如,可以使用 awk '{x++}END{ print x}' filename 代替 wc -l filename ,并且请放心,任务的成功不会受到我们可能想要处理但我们没有编写的文件的危害(例如第三方库,例如缩小的 JS 我们curld) - 除非我们的意图是真正按照 POSIX 兼容的方式计算 行。
结论
在现实生活中,对于某些文本文件(如 JS、HTML 和 CSS)跳过 EOL 会产生负面影响(如果有的话)的情况很少。如果我们依赖 的存在,我们将工具的可靠性限制在我们创作的文件中,并让我们自己面对第三方文件引入的潜在错误。
故事的寓意:工程师工具没有在 EOF 依赖 EOL 的弱点。
请随意发布适用于 JS、HTML 和 CSS 的用例,我们可以在其中检查跳过 EOL 的不利影响。