Некоторые компиляторы (особенно C или C ++) выдают предупреждения о:
No new line at end of file
Я думал, что это будет проблема только для C-программистов, но github отображает сообщение в коммит-представлении:
\ No newline at end of file
для файла PHP.
Я понимаю, что препроцессор объясняется в этой теме , но какое это имеет отношение к PHP? Это то же include()
самое или это связано с темой \r\n
против \n
?
Какой смысл иметь новую строку в конце файла?
cat
используете файл, следующая подсказка будет добавлена к последней «строке», если она не заканчивается новой строкой.Ответы:
Речь идет не о добавлении новой строки в конце файла, а об удалении новой строки, которая должна быть там.
Текстовый файл под UNIX, состоит из ряда линий , каждая из которых заканчивается с новой строки (
\n
). Поэтому файл, который не является пустым и не заканчивается новой строкой, не является текстовым файлом.Утилиты, которые должны работать с текстовыми файлами, могут плохо работать с файлами, которые не заканчиваются символом новой строки; например, исторические утилиты Unix могут игнорировать текст после последней новой строки. Утилиты GNU придерживаются политики приличного поведения с нетекстовыми файлами, как и большинство других современных утилит, но вы все равно можете столкнуться со странным поведением с файлами, в которых отсутствует финальный символ новой строки¹.
При использовании GNU diff, если один из сравниваемых файлов заканчивается новой строкой, но не другой, следует обратить внимание на этот факт. Так как diff ориентирован на строки, он не может указать это путем сохранения новой строки для одного из файлов, но не для других - новые строки необходимы, чтобы указать, где каждая строка в файле diff начинается и заканчивается. Так что diff использует этот специальный текст,
\ No newline at end of file
чтобы отличить файл, который не заканчивался переводом строки, от файла, который сделал.Кстати, в контексте C исходный файл аналогичным образом состоит из серии строк. Точнее говоря, единица перевода рассматривается в реализации, определенной как последовательность строк, каждая из которых должна заканчиваться символом новой строки ( n1256 §5.1.1.1). В системах Unix отображение является простым. В DOS и Windows каждая последовательность CR LF (
\r\n
) отображается на новую строку (\n
это то, что всегда происходит при чтении файла, открытого как текст в этих ОС). Есть несколько ОС, которые не имеют символа новой строки, но вместо этого имеют записи фиксированного или переменного размера; в этих системах отображение из файлов на источник C вводит\n
в конце каждой записи. Хотя это не имеет непосредственного отношения к unix, это означает, что если вы скопируете исходный файл C, в котором отсутствует заключительный символ новой строки, в систему с текстовыми файлами на основе записей, а затем скопируете ее обратно, вы либо получите неполное последняя строка усекается при первоначальном преобразовании или добавляется дополнительная строка при обратном преобразовании.¹ Пример: вывод сортировки GNU всегда заканчивается новой строкой. Так что, если в файле
foo
отсутствует последняя строка, вы обнаружите, что онsort foo | wc -c
сообщает еще на один символ больше, чемcat foo | wc -c
.источник
Не обязательно причина, но практическое следствие того, что файлы не заканчиваются новой строкой:
Подумайте, что произойдет, если вы захотите обработать несколько файлов с помощью
cat
. Например, если вы хотите найти словоfoo
в начале строки в 3 файлах:Если первая строка в file3 начинается с
foo
, но file2 не имеет финала\n
после своей последней строки, это вхождение не будет найдено grep, потому что последняя строка в file2 и первая строка в file3 будут рассматриваться grep как единый линия.Итак, для последовательности и во избежание неожиданностей я стараюсь, чтобы мои файлы всегда заканчивались новой строкой.
источник
'\n'
операцию на кошку ...\n
или пропускают на концах, поэтому, чтобы все было согласованно, я всегда ставлю\n _____
на обоих концах свои строки». Что ж, нет, правильная вещь - это обрезать строки и затем соединять их должным образом.Есть два аспекта:
Существуют / были некоторые компиляторы Си, которые не могут проанализировать последнюю строку, если она не заканчивается новой строкой. Стандарт C определяет, что файл C должен заканчиваться символом новой строки (C11, 5.1.1.2, 2.) и что последняя строка без символа новой строки приводит к неопределенному поведению (C11, J.2, 2-й элемент). Возможно, по историческим причинам, потому что какой-то поставщик такого компилятора был частью комитета, когда был написан первый стандарт. Таким образом, предупреждение от GCC.
diff
программы (например, используемыеgit diff
GitHub и т. д.) показывают различия между строками между файлами. Они обычно печатают сообщение, когда только один файл заканчивается новой строкой, потому что иначе вы не увидите этой разницы. Например, если единственное различие между двумя файлами - это наличие последнего символа новой строки, без подсказки будет выглядеть так, как если бы оба файла были одинаковыми, когдаdiff
и приcmp
возврате кода выхода получится неравный успех и контрольные суммы файлов (например, черезmd5sum
) не совпадают.источник
diff
ожидается, что распечатает различия, если они есть. И если один файл имеет символ новой строки в качестве последнего символа, а другой - нет, то эта разница должна быть как-то заметна в выводе.\n
«новые строки» ( ), вместо этого он может просто отображать «новые строки».\ No newline at end of file
Вы получаете от GitHub появляется в конце патча (вdiff
формате , смотрите примечание в конце раздела «Унифицированный формат»).Компиляторам не важно, есть ли новая строка или нет в конце файла, но
git
(и утилитыdiff
/patch
) должны принять это во внимание. Есть много причин для этого. Например, если вы забудете добавить или удалить символ новой строки в конце файла, это изменит его хэш-сумму (md5sum
/sha1sum
). Кроме того, файлы не всегда являются программами, и финал\n
может иметь какое-то значение.Примечание : по поводу предупреждения от компиляторов C, я думаю, они настаивают на заключительном переводе строки для целей обратной совместимости. Очень старые компиляторы могут не принять последнюю строку, если она не заканчивается
\n
(или другой системно-зависимой последовательностью символов конца строки).источник
Есть также смысл сохранять историю изменений. Если файл заканчивается без символа новой строки, то добавление чего-либо в конец файла будет рассматриваться утилитами diff как изменение последней строки (потому что
\n
она добавляется к нему).Это может привести к нежелательным результатам с такими командами, как
git blame
иhg annotate
.источник
-w
возможность игнорировать изменения пробелов при выводе данных для людей.POSIX, это набор стандартов, определенных IEEE для обеспечения совместимости между операционными системами.
Одним из них является определение «строки», представляющей собой последовательность из нуля или более не-символов плюс завершающий символ новой строки.
Таким образом, чтобы эта последняя строка была распознана как фактическая «строка», она должна иметь завершающий символ новой строки.
Это важно, если вы зависите от инструментов ОС, чтобы сказать количество строк или разбить / помочь разобрать ваш файл. Учитывая, что PHP является языком сценариев, его вполне возможно, особенно в его ранние времена или даже сейчас (я понятия не имею / постулирую), что у него были такие зависимости от ОС.
В действительности, большинство операционных систем не полностью POSIX-совместимы, и люди не похожи на эти машины или даже не заботятся о завершении новых линий. Так что для большинства вещей это "шведский стол" со всем, что либо заботится об этом, либо предупреждает, либо просто добавляет последний фрагмент текста - это действительно строка, поэтому просто включите ее.
источник