Heredoc при подстановке команд: ошибка при несбалансированности кавычек или скобок (bash и zsh)

Рассмотрим следующий обфусцированный скрипт, предназначенный для печати одиночной кавычки, который работает на ksh:

#!/bin/ksh
echo "$(cat <<EOF
'
EOF
)"

Выход:

'

Однако, когда я запускаю тот же скрипт с bash 3.2.51(1) в OS X,

#!/bin/bash
echo "$(cat <<EOF
'
EOF
)"

bash сообщает о следующих ошибках:

./heredoc-within-cmdsubst: line 3: unexpected EOF while looking for matching `''
./heredoc-within-cmdsubst: line 6: syntax error: unexpected end of file

И беги с zsh 5.0.2,

#!/bin/zsh
echo "$(cat <<EOF
'
EOF
)"

zsh сообщает о следующей ошибке:

./heredoc-within-cmdsubst:6: unmatched "

Подобные ошибки возникают, когда одинарная кавычка заменяется двойной кавычкой или скобкой. Если я уравновешиваю одинарную кавычку/двойную кавычку/круглую скобку с соответствующей одинарной/двойной кавычкой/круглой скобкой, то сценарий отлично работает как с bash, так и с zsh.

Является ли эта проблема просто ошибкой в ​​​​(соответствующих версиях) bash и zsh, или здесь нарушены какие-либо синтаксические правила?


person 4ae1e1    schedule 17.09.2014    source источник


Ответы (1)


Я бы считал это ошибкой синтаксического анализа, пока/если разработчики не скажут иначе. Код работает в dash как есть, и в этом zshвопросе есть аналогичная ошибка с незакрытыми кавычками.

ОБНОВЛЕНИЕ: Это фактически исправлено в bash 4.1; Проверил только в zsh 5.0.2 (последняя версия 5.0.6).

person chepner    schedule 17.09.2014
comment
Жаль, что в таких хорошо зарекомендовавших себя оболочках есть ошибки парсинга. :( - person 4ae1e1; 17.09.2014