Как я могу условно войти в состояние выхода и передать его в оболочке? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть модуль кода, в котором я буду проверять ошибки, используя "$?" в сценариях оболочки. Предположим следующий сценарий:

"sub_script.sh"// I have invalid host name inside this file
--error statements--


"Main.sh"
sh -x sub_script.sh >> $LOGFILE
if [ $? -eq 0 ];
then
 echo "error"
else
 echo "no error"
fi

Теперь, даже если у меня есть операторы ошибок в sub_script.sh, если я запускаю сценарий из main_script.sh, я не могу его обработать, потому что у меня есть оператор echo, который успешно выполняется и возвращает значение 0.

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

Есть ли какие-либо изменения для обработки сценариев такого типа в сценариях оболочки?

1 Ответ

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

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

#!/bin/sh

retval=0
recording_errors() {
  # local is not strictly POSIX syntax, but honored in dash and others.
  local local_retval >/dev/null 2>&1 ||:
  "$@"; local_retval=$?                # run our arguments as a command
  retval=$(( retval | local_retval ))  # OR the result into global exit status
  return "$local_retval"               # then return that local exit status.
}

if recording_errors ./sub_script; then
  echo "success running sub_script"
else
  echo "failure running sub_script"
fi

exit "$retval"

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

recording_errors thing_a || echo "WARNING: thing_a failed with status $?" >&2
recording_errors thing_b || echo "WARNING: thing_b failed with status $?" >&2
exit "$retval"   # exit with the combination of both thing_a and thing_b retval
...