Bash EOF имеет неожиданное поведение - PullRequest
0 голосов
/ 25 ноября 2010

Я использовал быстрый и грязный BASH-скрипт для автоматизации процесса разбиения CF.
Это работало хорошо, пока я не хотел добавить к этому.

По сути, у меня есть скрипт, который разбивает компактную флешку как таковую:

CMD=.fdisk
DEV=/dev/sdc

echo "Calculating partition sizes..."
P1SIZE=+1100M
P2SIZE=+1200M

echo "Creating instruction file..."
PT1="n p 1\n $P1SIZE"
PT2="n p 2\n $P2SIZE"
END="a 1 w EOF\n"

[ -e $CMD ] && rm -rf $CMD

for i in $PT1 $PT2 $END; do echo -e $i >> $CMD; done

echo "Creating partitions..."
fdisk $DEV << EOF < $CMD
[ -e $CMD ] && rm -f $CMD

Идея состоит в том, что в будущем файл, представленный как $ CMD, будет автоматически создан внешним инструментом с правильными начальными и конечными значениями. Прямо сейчас я просто принимаю запуск по умолчанию и предоставляю размер.

Это работало довольно хорошо, пока я не хотел включить несколько дополнительных шагов в свой сценарий. Но я столкнулся с проблемами, когда заметил странное поведение.

Во-первых, если я добавлю приведенный выше код внутри функции, я получу сообщение об ошибке скрипта:

line XX: syntax error: unexpected end of file

Кроме того, я понял, что любой дополнительный код после команды 'fdisk' не будет выполняться, и сценарий просто завершается (без ошибок, $? = 0).

Кто-нибудь знает, почему функция не работает и скрипт завершается?

Ответы [ 2 ]

4 голосов
/ 26 ноября 2010

Практическое правило заключается в том, что используемая вами «предельная строка» (я использовал «EOF» в моем случае, но вы можете использовать все, что вы хотите) не должна иметь пробелов (или табуляции) перед ней.Если это так, он не будет считаться концом.

Пример:

myFunction() {
    cat << EOF
        Hello
        World
        EOF
}

Вышеуказанный 'EOF' считается обычным текстом, потому что перед ним есть пробелы!Если вместо этого вы напишите следующее:

myFunction() {
    cat << EOF
        Hello
        World
EOF
}

Теперь это будет работать!

Если вы настаиваете на использовании пробелов, вы можете подавить вкладки, используя символ «-» для непосредственного использования.справа от символов «<<». </p>

Пример:

myFunction() {
    cat <<- EOF
        Hello
        World
        EOF
}

Обратите внимание, что это работает только для вкладок, а не пробелов!Это здорово, чтобы ваш код был немного более читабельным.

Также обратите внимание, что если вы заключите в кавычки «строку предела», вы в конечном итоге отключите подстановку параметров.Поэтому, если вы хотите написать текст, который не должен быть заменен или выполнен, это делает возможным:

cat << "EOF"
    Type `ls -la` at the command prompt
EOF
3 голосов
/ 25 ноября 2010

Вы запустили heredoc (<< EOF), но никогда его не прекращаете.

...