Заявление Bash зависает, когда внутри здесь doc

Я совершенно озадачен тем, почему следующий скрипт bash зависает в CentOS6.4.

/bin/cat >> /root/heredoc <<EOF

    if [ $(grep -c "$IP_ADDR\|$HOSTNAME" $HOSTS_FILE) -ne 0 ]; then
EOF

Не беспокойтесь, если содержимое этого документа не имеет смысла. Я просто удалил строку кода, из-за которой скрипт зависает. Мне определенно не хватает понимания того, как bash обрабатывает здесь документы. Дело не в трубе (вертикальной планке) так как без трубы все равно висит.


person The Governor    schedule 11.07.2013    source источник
comment
вы хотите, чтобы содержимое heredoc выполнялось как скрипт, или вы просто хотите, чтобы содержимое было как литеральная строка?   -  person Kent    schedule 12.07.2013
comment
Я хочу содержимое в виде буквальной строки. Обработка или оценка содержимого не требуется.   -  person The Governor    schedule 12.07.2013


Ответы (2)


Я хочу содержимое в виде буквальной строки. Обработка или оценка содержимого не требуются.

если вы хотите, чтобы содержимое было буквальным текстом, попробуйте следующее:

/bin/cat >> /root/heredoc << 'EOF'

    if [ $(grep -c "$IP_ADDR\|$HOSTNAME" $HOSTS_FILE) -ne 0 ]; then
whatever you have

EOF

примечание, одинарные кавычки heredoc 'EOF'

вот пример:

kent$  cat << eof
$(echo $HOME)
eof
/home/kent

kent$  cat << 'eof'
$(echo $HOME)
eof
$(echo $HOME)
person Kent    schedule 11.07.2013

Проблема $( grep ... ). Документ ЗДЕСЬ по умолчанию интерпретируется как строка в двойных кавычках, что означает выполнение grep. Вероятно, $HOSTS_FILE пуст, поэтому grep ожидает стандартного ввода (попробуйте нажать Ctrl+D).

person choroba    schedule 11.07.2013
comment
если $HOSTS_FILE пуст, вы получите grep: (standard input): Input/output error - person sds; 12.07.2013
comment
@choroba Я пытаюсь создать файл конфигурации upstart из скрипта. grep находится в теле создаваемого файла conf. Как бы вы тогда поступили? - person The Governor; 12.07.2013
comment
@braindead: Если вы не хотите интерпретировать heredoc, используйте << 'EOF'. Если вы хотите, чтобы некоторые переменные интерпретировались, поставьте обратную косую черту перед знаками доллара, которые вы не хотите интерпретировать. - person choroba; 12.07.2013