Какой смысл того, чтобы добавить новую строку в конец файла?

Можно использовать ifconfig.me в качестве альтернативы whatismyip.org.

curl -s http://ifconfig.me

Также ifconfig.me имеет некоторых дополнительных функциональный. Для обнаружения, какую информацию можно получить, посещают веб-сайт.

181
23.05.2017, 15:40
5 ответов

Это не о добавлении, что дополнительная новая строка в конце файла, именно о не удалении новой строки должна быть там.

Текстовый файл, под Unix, состоит из серии строк, каждая из которых заканчивается символом новой строки (\n). Файл, который не пуст и не заканчивается новой строкой, является поэтому не текстовым файлом.

Утилиты, которые, как предполагается, воздействуют на текстовые файлы, не могут справиться хорошо с файлами, которые не заканчиваются новой строкой; исторические утилиты Unix могли бы проигнорировать текст после последней новой строки, например. Утилиты GNU имеют политику поведения прилично с нетекстовыми файлами, и также - большинство других современных утилит, но можно все еще встретиться с нечетным поведением с файлами, которые пропускают заключительную новую строку ¹.

С разностью GNU, если один из файлов, сравниваемых концы с новой строкой, но не другим, это старается отметить тот факт. Так как разность ориентирована на строку, она не может указать на это путем хранения новой строки для одного из файлов, но не для других — новые строки необходимы указать, где каждая строка в различном файле запускается и заканчивается. Таким образом, разность использует этот специальный текст \ No newline at end of file дифференцировать файл, который не закончился в новой строке из файла, который сделал.

Между прочим, в контексте C исходный файл так же состоит из серии строк. Более точно единица перевода просматривается в определенном реализацией как серия строк, каждая из которых должна закончиться символом новой строки (n1256 §5.1.1.1). В системах Unix отображение просто. На DOS и Windows, каждая последовательность CR LF (\r\n) отображается на новой строке (\n; это - то, что всегда происходит при чтении файла, открытого как текст на этих Ose). Существует несколько Ose там, которые не имеют символа новой строки, но вместо этого зафиксировали - или записи переменного размера; в этих системах отображение от файлов до источника C представляет a \n в конце каждой записи. В то время как это не непосредственно относится к Unix, это действительно означает, что, если Вы копируете исходный файл C, это пропускает его заключительную новую строку к системе с основанными на записи текстовыми файлами, затем скопируйте его назад, Вы или закончите с неполной последней строкой, усеченной в начальном преобразовании или дополнительной новой строке, прикрепляемой на него во время обратной конверсии.

¹ Пример: вывод вида GNU всегда заканчивается новой строкой. Таким образом, если файл foo пропускает его заключительную новую строку, Вы найдете это sort foo | wc -c сообщает еще один символ, чем cat foo | wc -c.

210
27.01.2020, 19:27
  • 1
    Касающееся "... серия строк, каждая из которых должна закончиться символом новой строки (n1256 §5.1.1.1)"-> В рассмотрении более свежий C11dr N1570, не нашло поддержку этого кроме, возможно: "Исходный файл, который не пуст, должен закончиться в символе новой строки, которому не должен сразу предшествовать символ обратной косой черты, прежде чем любое такое соединение произойдет". §5.1.1.2 2, но это, кажется, ограничивается соединением спецификаций. –  chux - Reinstate Monica 04.08.2016, 19:22
  • 2
    @chux, Что предложение присутствует в n1256 также. Последняя строка должна закончиться символом новой строки. Строки, которые не являются последней строкой, должны, очевидно, также закончиться символом новой строки, чтобы указать, что это концы строки и следующая строка начинается. Таким образом каждая строка должна закончиться символом новой строки. –  Gilles 'SO- stop being evil' 04.08.2016, 19:40
  • 3
    Хм, мне, та строка ""Исходный файл... соединяющий, происходит". мог быть ограничен как, соединив соображения и не файлы в целом. Все же я вижу, как можно было просмотреть иначе. Возможно, я буду искать сообщение, которое фокусируется на этом. –  chux - Reinstate Monica 04.08.2016, 20:01
  • 4
    >, "Таким образом, разность использует этот специальный текст \Никакая новая строка в конце файла для дифференциации файла, который не закончился в новой строке из файла, который сделал". Мерзавец показывает этот текст, не только когда он сравнивает файлы. Но даже когда новый файл, добавленный к мерзавцу. Таким образом, этот аргумент не допустим, я предполагаю. –  Viktor Kruglikov 12.01.2018, 17:54
  • 5
    > "Утилиты, которые, как предполагается, воздействуют на текстовые файлы, не может справиться хорошо с файлами, которые не заканчиваются новой строкой", я не думаю, что это - бизнес мерзавца для заботы о таких низкоуровневых проблемах как пропавшие без вести \n из-за требований POSIX. Я думаю, что, если мерзавец показывает это сообщение, причина должна быть в проблемах управления исходным кодом. –  Viktor Kruglikov 12.01.2018, 17:58

Не обязательно причина, но практическое последствие файлов, не заканчивающихся новой строкой:

Рассмотрите то, что произошло бы, если бы Вы хотели обработать несколько использований файлов cat. Например, если Вы хотели найти слово foo в начале строки через 3 файла:

cat file1 file2 file3 | grep -e '^foo'

Если первая строка в file3 запускается с foo, но file2 не имеет финала \n после его последней строки это возникновение не было бы найдено grep, потому что последняя строка в file2 и первая строка в file3 будут рассматриваться grep как одна строка.

Так, для последовательности и для предотвращения неожиданностей, которые я пытаюсь сохранить своими файлами, всегда заканчивающимися новой строкой.

45
27.01.2020, 19:27
  • 1
    Но действительно ли это - бизнес мерзавца для заботы о конкатенации файлов? –  Viktor Kruglikov 15.01.2018, 11:33

Существует два аспекта:

  1. Существуют некоторые компиляторы C, которые не могут проанализировать последнюю строку, если она не заканчивается новой строкой. Стандарт C указывает, что файл C должен закончиться новой строкой (C11, 5.1.1.2, 2.) и что последняя строка без новой строки приводит к неопределенному поведению (C11, J.2, 2-й объект). Возможно, по историческим причинам, потому что некоторый поставщик такого компилятора был частью комитета, когда первый стандарт был записан. Таким образом предупреждение GCC.

  2. diff программы (как используемый git diff, GitHub и т.д.), показывают линию за линией различия между файлами. Они обычно печатают сообщение, когда только один файл заканчивается новой строкой, потому что еще Вы не видели бы это различие. Например, если бы единственной разницей между двумя файлами является присутствие последнего символа новой строки, без подсказки было бы похоже, что оба файла были тем же, когда diff и cmp возвратите код выхода неравный успех и контрольные суммы файлов (например, через md5sum) не соответствовать.

16
27.01.2020, 19:27

\ No newline at end of file Вы добираетесь от GitHub, появляется в конце патча (в diff формат, см. примечание в конце раздела "Unified Format").

Компиляторы не заботятся, существует ли новая строка или не в конце файла, но gitdiff/patch утилиты), должны взять тех, которые в учетной записи. Существует много причин этого. Например, упущение добавить или удалить новую строку в конце файла изменило бы свой hashsum (md5sum/sha1sum). Кроме того, файлы являются не всегда программами и финалом \n мог бы иметь некоторое значение.

Примечание: О предупреждении от компиляторов C я предполагаю, что они настаивают для заключительной новой строки в целях обратной совместимости. Очень старые компиляторы не могли бы принять последнюю строку, если не заканчивается \n (или другая системно-зависимая последовательность символа конца строки).

10
27.01.2020, 19:27
  • 1
    "Я предполагаю, что они настаивают для заключительной новой строки в целях обратной совместимости" - Нет, они настаивают на нем, потому что стандарт C передает под мандат его. –  MestreLion 28.08.2013, 12:25

Есть также смысл хранить различную историю. Если файл заканчивается без символа новой строки, то добавление чего-либо в конец файла будет рассматриваться утилитами diff как изменение последней строки (так как \n добавляется к нему).

Это может привести к нежелательным результатам с помощью таких команд, как git blame и hg annotate.

4
27.01.2020, 19:27

Теги

Похожие вопросы