Этот ответ - скорее попытка технического ответа, чем мнения.
Если мы хотим быть пуристами 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
мы читаем:
Строка определяется как строка символов, разделенных символом .
Какое значение имеют файлы JavaScript, HTML и CSS в том, что они являются текстовыми файлами?
В браузерах, современных IDE и других интерфейсных приложениях нет проблем с пропуском EOL при EOF. Приложения будут правильно анализировать файлы. Это связано с тем, что не все операционные системы соответствуют стандарту POSIX, поэтому неинструментальным инструментам (например, браузерам) было бы непрактично обрабатывать файлы в соответствии со стандартом POSIX (или любым стандартом уровня операционной системы).
В результате мы можем быть относительно уверены, что EOL в EOF практически не окажет негативного влияния на уровне приложений - независимо от того, работает ли он в ОС UNIX.
На данный момент мы можем с уверенностью сказать, что пропуск EOL в EOF безопасен при работе с JS, HTML, CSS на стороне клиента. На самом деле, мы можем утверждать, что минимизация любого из этих файлов, не содержащих , безопасна.
Мы можем сделать еще один шаг и сказать, что в отношении NodeJS он также не может придерживаться стандарта POSIX, поскольку он может работать в средах, не поддерживающих POSIX.
Что же нам тогда осталось? Инструменты системного уровня.
Это означает, что единственные проблемы, которые могут возникнуть, связаны с инструментами, которые прилагают усилия, чтобы привязать свою функциональность к семантике POSIX (например, определение строки, как показано в wc
).
Несмотря на это, не все оболочки будут автоматически придерживаться POSIX. Например, Bash не использует POSIX по умолчанию. Для этого есть переключатель: POSIXLY_CORRECT
.
Пища для размышления о значении EOL : https://www.rfc -editor.org / old / EOLstory.txt
Оставаясь на дорожке инструмента, для всех практических целей и задач, давайте рассмотрим это:
Давайте работать с файлом, у которого нет EOL. На момент написания статьи файл в этом примере представлял собой уменьшенный JavaScript без EOL.
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
делает то, что должен.
В man
из cat
упоминается только чтение ввода до EOF, а не . Обратите внимание, что -n
переключатель cat
также выведет не завершенную строку (или неполную строку ) в виде строки - при этом отсчет начинается с 1 (согласно man
.)
-n Количество выходных строк, начиная с 1.
Теперь, когда мы понимаем, как POSIX определяет строку , это поведение становится неоднозначным или действительно несовместимым.
Понимание цели и соответствия данного инструмента поможет определить, насколько важно завершить файлы EOL. В C, C ++, Java (JAR) и т. Д. ... некоторые стандарты будут предписывать новую строку для валидности - для JS, HTML, CSS такого стандарта не существует.
Например, вместо использования wc -l filename
можно сделать awk '{x++}END{ print x}' filename
, и будьте уверены, что успех задачи не будет поставлен под угрозу файлом, который мы можем захотеть обработать, но который мы не записали (например, сторонней библиотекой, такой как минимизированный JS мы curl
d) - если только мы не собирались действительно считать строк в смысле совместимости с POSIX.
Заключение
В реальных случаях будет очень мало случаев, когда пропуск EOL в EOF для определенных текстовых файлов, таких как JS, HTML и CSS, будет иметь негативное влияние - если вообще будет. Если мы полагаемся на присутствие , мы ограничиваем надежность наших инструментов только теми файлами, которые мы создаем, и открываем себя для потенциальных ошибок, допущенных сторонними файлами.
Мораль истории: инструментальные средства инженера, у которых нет слабости полагаться на EOL в EOF.
Не стесняйтесь публиковать варианты использования, так как они относятся к JS, HTML и CSS, где мы можем изучить, как пропуск EOL отрицательно сказывается.