Назад | Перейти на главную страницу

способы автоматического исправления окончаний строк в сценариях оболочки или файлах, которые прерываются с помощью ^ M

Проблема

Мы регулярно ломаем окончания строк в файлах, и все перестает работать, и мы этого не замечаем.

Bash жалуется на «недопустимый параметр» или «: команда не найдена», как описано здесь: http://thinkinginsoftware.blogspot.ca/2012/11/linux-server-cries-for-linux-desktop.html

Я обеспокоен тем, что это может сломать и другие текстовые файлы (conf, crons ...)

Как мы это сломаем (я полагаю)

Мы - группа людей, использующих Windows, Mac или Linux для редактирования файлов Linux на одном сервере. Мы редактируем эти файлы вручную (ssh + vi / nano или localy + ftp). Иногда мы копируем / вставляем, и я думаю, что это причина проблемы. Да, иногда мы не тестируем наши изменения по не очень веским причинам: тот же скрипт работает на реплицирующем сервере, изменение просто отступает от некоторых строк и т. Д. Я согласен с этим.

Использование решений типа Chef / Puppet не планируется.

Обновить

Копирование и вставка TL; DR не является проблемой, в отличие от FTP.

Я провел некоторое тестирование с копированием / вставкой окончаний строк Windows CRLF в Windows + Notepad ++ + PuTTY + nano и vi. Похоже, что символ CR (^ M) отфильтрован, в файлы вставляется только LF. Спасибо за то, что заставили меня усомниться в теории копирования / вставки!

Я передал файл с окончанием CRLF через FTP с помощью FileZilla, параметр «Режим отправки» стал автоматическим. CRLF сохраняются. Интересно, сможет ли FileZilla преобразовать их в LF.

Смягчение

Мы не можем запретить операционные системы, отличные от Linux, или запретить копирование.

Я подумал об этих решениях:

  1. Создайте cron.minute, который запускает dos2unix или sed для всех скриптов. Минусы: нам нужно поддерживать список «изменяемых текстовых файлов», так как я не хочу, чтобы он запускался на /
  2. Используйте текстовый редактор, который поддерживает дополнительные команды после изменения файла. Минусы: может сломать файлы, которые законно используют окончания строк, отличных от Linux, не работает, когда мы пишем ftp-скрипты.
  3. Используйте систему запуска, например http://inotify.aiken.cz/?section=incron&page=about&lang=en. Минусы:?

Плюсы №2 и №3: мы также можем использовать их, чтобы добавить последнюю пустую строку для программ, которые в ней нуждаются.

Использование bash, версия 4.2.37 (1) -release

Связанные вопросы по ^ M (CRLF)

Редактировать: Я получил один голос против, не могли бы вы объяснить почему?

Иногда мне приходится иметь дело с этим с некоторыми устаревшими системами. Иногда файлы, хранящиеся в системе контроля версий организации (Borland Starteam) были установлены неправильные настройки перевода строки.

Но при работе в нескольких кросс-платформенных средах копирование / вставка не должно вызывать только эту проблему. Постарайтесь определить тенденции на основе следующих выводов и соответствующим образом разобраться с наиболее серьезными нарушителями.

Периодически ищите файлы с переводом строки DOS.

find /var/www -not -type d -exec file "{}" ";" | grep CRLF

Пример:

# find /ppro/bin -not -type d -exec file "{}" ";" | grep CRLF
/ppro/bin/compile/save/srcfix.c: ASCII C program text, with CRLF line terminators
/ppro/bin/compile/bldtag.c: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/compile/bldtag.c.sav: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/compile/dbcsum2.c: ASCII Pascal program text, with CRLF line terminators
/ppro/bin/hphw/print_sv.c: ASCII text, with CRLF line terminators
/ppro/bin/linuxhw/dhcpd.conf: ASCII text, with CRLF line terminators
/ppro/bin/linuxhw/dhcpd.conf.mult_subnet: ASCII text, with CRLF line terminators

затем СЖИГАТЬ их!!

Помните, что dos2unix в некоторых системах будут изменять разрешения ...