Безобидный пробел

Безобидный пробел, попавший в неподходящее место, может украсть несколько десятков драгоценных минут. Фрагмент

for mod in mysql mysqli snmp pdo pdo_mysql pdo_sqlite; do
    cat > $RPM_BUILD_ROOT%{_sysconfdir}/php.d/${mod}.ini <<EOF
; Enable ${mod} extension module
extension=${mod}.so
EOF 
    cat > files.${mod} <<EOF
%attr(755,root,root) %{_libdir}/php/modules/${mod}.so
%config(noreplace) %attr(644,root,root) %{_sysconfdir}/php.d/${mod}.ini
EOF
done

Должен создавать два набора файлов ${mod}.ini и files.${mod}. В действительности создается один набор ${mod}.ini с неверным содержимым. Например, для mysql получаем mysql.ini с содержимым:

; Enable mysql extension module
extension=mysql.so
EOF 
    cat > files.mysql <<EOF
%attr(755,root,root) %{_libdir}/php/modules/mysql.so
%config(noreplace) %attr(644,root,root) %{_sysconfdir}/php.d/mysql.ini

Оказалось первый завершающий EOF содержит за собой пробел. Соответственно командный интерпретатор путается в показаниях и не может сравнить «EOF» с «EOF «.

2 thoughts on “Безобидный пробел

    • Можно меньшей кровью обойтись http://vim.wikia.com/wiki/Highlight_unwanted_spaces 😉

      Вся загвоздка заключается в том, что в большинстве мест лишние пробелы и табуляции не создают проблем. Соответственно нагромождение лишней подсветкой разделителей будет распыляться внимание. Более того т.к. данная конструкция встретилась в SPEC-файле, подсветка sh-синтаксиса не работала, а она бы выявила ошибку. Плюс неудачное стечение обстоятельств: два последовательных cat с завершающим EOF.

Добавить комментарий

Ваш e-mail не будет опубликован.