Вернуть код выхода без закрытия оболочки

Я хотел бы вернуть код выхода из BASH script, который вызывается внутри другого script, но также может быть вызван напрямую. Он примерно выглядит следующим образом:

#!/bin/bash
dq2-get $1
if [ $? -ne 0 ]; then
  echo "ERROR: ..."
  # EXIT HERE
fi
# extract, do some stuff
# ...

Теперь в строке EXIT HERE script должен выйти и вернуть код выхода 1. Проблема в том, что

  • Я не могу использовать return, потому что, когда я забуду исходный script вместо его вызова, return не выйдет, а остальная часть script будет выполнена и запутаться.
  • Я не могу использовать exit, потому что это закрывает оболочку.
  • Я не могу использовать хороший трюк kill -SIGINT $$, потому что это не позволяет вернуть код выхода.

Есть ли жизнеспособная альтернатива, которую я упустил?

Ответ 1

Вы можете использовать x"${BASH_SOURCE[0]}" == x"$0", чтобы проверить, был ли источник script получен или вызван (false, если источник, true, если вызвано) и return или exit соответственно.

Ответ 2

Используйте это вместо выхода или возврата:

[ $PS1 ] && return || exit;

Работает ли источник или нет.

Ответ 3

Другой вариант - использовать функцию и поместить в нее возвращаемые значения, а затем просто либо указать источник script (source processStatus.sh), либо вызвать script (./processStatus.sh). Например, рассмотрим processStatus.sh script, который должен вернуть значение stopProcess.sh script, но также должен быть вызван отдельно от командной строки без использования источника (включая только соответствующие части) Например:

 function checkProcess {
   if [ $1 -eq "50" ]
   then
       return 1       
   else
       return 0
   fi       
 }

 checkProcess

и

source processStatus.sh $1
RET_VALUE=$?
if [ $RET_VALUE -ne "0" ]
then
    exit 0
fi