Команда read
пытается прочитать одну строку из стандартного ввода. Если по какой-либо причине происходит сбой - включая попадание в конец файла перед тем, как увидеть терминатор строки - он завершается с ненулевым состоянием. В вашем случае, опция -d ''
указывает read
искать нулевой символ ASCII в качестве ограничителя строки, и поскольку у документа здесь нет ни одного, который он читает, пока не достигнет EOF ... и затем завершится с статус ошибки. Поведение
read
может быть немного нелогичным. Он успешно что-то прочитал и установил переменную (payload
) просто отлично; но так как он достиг EOF, стандарт POSIX требует возврата ошибки. То же самое происходит при построчном чтении текстового файла, и последняя строка не заканчивается .
Обычно это не будет большим делом, но * Параметр 1012 * для set
заставляет оболочку завершиться, если любая простая команда завершается с ненулевым статусом (ошибка) (с большим количеством грязных исключений , которые здесь не актуальны). Когда read
делает это, скрипт сразу же выходит.
Итак, есть несколько возможных решений. Вы можете просто не использовать set -e
, вы можете поставить set +e
непосредственно перед командой read
(и, возможно, set -e
снова после), или вы можете сделать ее составной командой, которая будет успешной, например:
read -rd '' payload << EOF || true
...
(Здесь ||
означает, что если первая команда завершится неудачно, будет запущена вторая, и true
всегда будет успешной, поэтому составная команда считается успешной.)