Нет ошибки из скрипта для несуществующего файла - PullRequest
0 голосов
/ 06 июня 2019

У меня есть сценарий оболочки, который читает текстовый файл и использует его содержимое.Все идет нормально.Но сейчас я пытаюсь заставить скрипт завершиться, если файл не найден.Сценарий выглядит так:

#!/bin/bash

function errorcatcher() {
  errorcode=$?
  echo "ERROR CODE : ${errorcode}"
  exit ${errorcode}
}

trap errorcatcher ERR

MYFILE=$1

IFS='|'

while read line; do
  echo ${line}
done < ${MYFILE}

echo "Execution complete"

И я запускаю сценарий как

sh myscript.sh /home/mydir/ABC.txt

, и он отлично работает.Но если я попробую это

sh myscript.sh /home/mydir/nonexisting.file

, я получу

myscript.sh: line 17: /home/mydir/nonexisting.file: No such file or directory
Execution complete

Функция errorcatcher не вызывается, и вместо выхода с кодом ошибки выполнение продолжается, и я получаю строкуExecution complete даже если рассматриваемый файл не существует.Я предполагаю, что здесь не генерируется никаких ошибок, поэтому я добавил эту строку перед чтением текстового файла

ls ${MYFILE}

На этот раз вызывается errorcatcher.Но если я попробую

sh myscript.sh /home/mydir/ABC.tx

Вместо существующего файла ABC.txt, я передаю его неполное имя ABC.tx, и снова, функция errorcatcher не вызывается, и сценарий завершается успешно (Execution complete получаетповторил).

Может ли кто-нибудь помочь мне с этим?Мне любопытно, почему errorcatcher не вызывается

  1. для несуществующего файла без ls
  2. для неполного имени файла (ABC.tx) с ls

1 Ответ

0 голосов
/ 07 июня 2019

Функция errorcatcher не вызывается…

Действительно, с ошибкой в ​​перенаправлении цикла, например

while read line; do
  …
done < ${MYFILE}

ERR ловушкане вызывается.Вы обнаружили недокументированное исключение в реализации команды trap или, если хотите, ошибку.

Этого можно избежать, добавив дополнительный тест перенаправления перед while, напримерстрока

<$MYFILE

сама по себе вызовет ловушку с ошибкой.

...