Способы автоматического исправления концов строк в скриптах оболочки или файлах, которые ломаются с ^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-подобных решений не планируется.

Обновить

TLDR copy-paste не проблема, FTP есть.

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

Я перенес файл с CRLF-завершением по FTP, используя FileZilla, опция "Режим отправки" автоматически. CRLF сохраняются. Интересно, сможет ли FileZilla конвертировать их в LF?

смягчение

Мы не можем ни запретить ОС Linux, ни запретить копирование-вставку.

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

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

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

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

Похожие вопросы по ^M (CRLF)

Изменить: я получил один downvote, не могли бы вы объяснить, почему?

1 ответ

Мне приходится иметь дело с этим иногда с некоторыми устаревшими системами. Иногда файлы, сохраненные в исходном контроле организации ( 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 на некоторых системах будут изменять разрешения...

Другие вопросы по тегам