Почему не выводится ошибка при завершения bash-скрипта?

Когда в bash скрипте я обращаюсь к не существующему файлу, скрипт выдает ошибку и завершает работу из-за этой ошибке.

#!/bin/bash

# чтобы скрипт автоматически завершался при ошибке
set -e

# читаем из файла
read < file

# не выполняется, так как была ошибка при чтение
echo no-continue

В терминал выводится:

./test: line 5: file: No such file or directory

Но когда я обращаюсь к пустому файлу, скрипт тоже завершается из-за ошибки, но не выводит никакую ошибку. почему?

#!/bin/bash

# чтобы скрипт автоматически завершался при ошибке
set -e

# создаем файл
touch file
# читаем из файла
read < file

# не выполняется, так как была ошибка при чтение
echo no-continue

В терминал ни чего не выводится. Почему не выводит ошибку в терминал?


Ответы (1 шт):

Автор решения: Pak Uula

В первом случае ошибка относится не к read, а к самому интерпретатору: он не может создать перенаправление < file, о чём и сообщает.

Во втором случае read возвращается с ненулевым кодом, прочитав файл file до конца:

The exit status is zero, unless end-of-file is encountered

Для read этот ненулевой код не является ошибкой. Так как в большинстве случаев read используется внутри циклов while read ... ; do ... ; done, конец файл должен приводить к выходу из цикла. Ненулевой статус read как раз обеспечивает выход из цикла. Если бы read каждый раз печатал сообщение о EOF, это было бы очень неудобно.

→ Ссылка