Рассмотрим следующий обфусцированный скрипт, предназначенный для печати одиночной кавычки, который работает на 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, или здесь нарушены какие-либо синтаксические правила?