Вернуть код выхода без закрытия оболочки - PullRequest
15 голосов
/ 24 мая 2011

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

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 25 января 2014

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

[ $PS1 ] && return || exit;

Работает независимо от источника.

8 голосов
/ 24 мая 2011

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

3 голосов
/ 24 ноября 2018

Ответ на заголовок вопроса (не в теле, как другие ответы):

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

(exit 33)

То, что устанавливает код выхода без выхода из оболочки (ни из сценария с источником).

Для более сложного вопроса о выходе (с определенным кодом выхода), если он выполнен или получен:

#!/bin/bash
[ "$BASH_SOURCE" == "$0" ] &&
    echo "This file is meant to be sourced, not executed" && 
        exit 30

return 88

При выполнении будет установлен код выхода 30 (с сообщением об ошибке).
И код выхода 88, если получены. Завершит оба выполнения или поиска без влияния на вызывающую оболочку.

1 голос
/ 02 января 2015

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

 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
...