Разница между возвратом и выходом в функциях Bash

В чем разница между инструкциями return и exit в функциях Bash относительно кодов выхода?

Ответ 1

От man bash по return [n];

Заставляет функцию прекратить выполнение и вернуть значение, указанное в n, вызывающей стороне. Если n опущено, возвращается статус последней команды, выполненной в теле функции.

... при exit [n]:

Заставить оболочку выйти со статусом n. Если n опущено, статус выхода соответствует статусу последней выполненной команды. Ловушка EXIT выполняется перед завершением оболочки.

РЕДАКТИРОВАТЬ:

Согласно вашему редактированию вопроса, касающемуся кодов выхода, return имеет ничего общего с кодами выхода. Коды выхода предназначены для приложений/скриптов, а не функций. Таким образом, в этом отношении единственное ключевое слово, которое устанавливает код завершения скрипта (то, которое может быть перехвачено вызывающей программой с помощью переменной $? Shell), - это exit.

РЕДАКТИРОВАТЬ 2:

Мое последнее выражение о exit вызывает некоторые комментарии. Он был сделан для того, чтобы различать функции return и exit для понимания OP, и фактически в любой точке скрипта программы/оболочки exit - единственный способ завершить сценарий кодом выхода для вызывающего процесса.

Каждая команда, выполняемая в оболочке, создает локальный "код выхода": она устанавливает $? переменная для этого кода, и может использоваться с if, && и другими операторами для условного выполнения других команд.

Эти коды выхода (и значение переменной $?) Сбрасываются при каждом выполнении команды.

Между прочим, код выхода последней команды, выполняемой сценарием, используется в качестве кода выхода самого сценария, видимого вызывающим процессом.

Наконец, функции при вызове действуют как команды оболочки относительно кодов выхода. Код выхода функции (внутри функции) устанавливается с помощью return. Таким образом, когда в функции return 0, выполнение функции завершается, давая код завершения 0.

Ответ 2

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

#!/bin/bash

retfunc()
{
    echo "this is retfunc()"
    return 1
}

exitfunc()
{
    echo "this is exitfunc()"
    exit 1
}

retfunc
echo "We are still here"
exitfunc
echo "We will never see this"

Выход

$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()

Ответ 3

Я не думаю, что кто-то действительно полностью ответил на вопрос, потому что они не описывают, как они используются. Хорошо, я думаю, что мы знаем, что выход убивает скрипт, где бы он ни вызывался, и вы также можете присвоить ему статус, такой как выход или выход 0 или выход 7 и так далее. Это может быть использовано для определения того, как сценарий был принудительно остановлен, если вызван другим сценарием и т.д. Достаточно при выходе.

return при вызове вернет указанное значение, чтобы указать поведение функции, обычно 1 или 0. Например:

    #!/bin/bash
    isdirectory() {
      if [ -d "$1" ]
      then
        return 0
      else
        return 1
      fi
    echo "you will not see anything after the return like this text"
    }

проверьте вот так:

    if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi

или вот так:

    isdirectory || echo "not a directory"

В этом примере тест может использоваться, чтобы указать, был ли найден каталог. обратите внимание, что что-либо после возврата не будет выполнено в функции. 0 верно, но false равно 1 в оболочке, в отличие от других прог-языков.

Для получения дополнительной информации о функциях: http://www.linuxjournal.com/content/return-values-bash-functions

ПРИМЕЧАНИЕ. Функция isdirectory предназначена только для ознакомительных целей. Это не должно быть то, как вы выполняете такую опцию в реальном скрипте.

Ответ 4

Помните, что функции являются внутренними для script и обычно возвращаются с того момента, когда они были вызваны с помощью оператора return. Вызов внешнего script - это совсем другое дело, и скрипты обычно заканчиваются оператором exit.

Разница между оператором return и exit в функциях BASH относительно кодов выхода очень мало. Оба возвращают статус, а не значения как таковые. Состояние нуля указывает на успех, тогда как любой другой статус (от 1 до 255) указывает на сбой. Оператор return вернется в script, откуда он был вызван, в то время как оператор exit завершит весь script из того места, где он встречается.

return 0  # returns to where the function was called.  $? contains 0 (success).

return 1  # returns to where the function was called.  $? contains 1 (failure).

exit 0  # exits the script completely.  $? contains 0 (success).

exit 1  # exits the script completely.  $? contains 1 (failure).

Если ваша функция просто заканчивается без оператора возврата, статус последней выполненной команды возвращается как код состояния (и будет помещен в $?).

Помните, что возврат и выход возвращают код состояния от 0 до 255, доступный в $?. Вы не можете вносить что-либо еще в код состояния (например, return "cat" ); это не будет работать. Но script может передать 255 различных причин сбоя с помощью кодов состояния.

Вы можете установить переменные, содержащиеся в вызывающем script, или эхо результаты в функции и использовать подстановку команд в вызывающем script; но целью возврата и выхода является передача кодов состояния, а не значений или результатов вычислений, как можно было бы ожидать на языке программирования, таком как C.

Ответ 5

Иногда вы запускаете script с помощью . или source.

. a.sh

Если вы включили exit в a.sh, он не просто завершит script, но завершает сеанс оболочки.

Если вы включили return в a.sh, он просто прекращает обработку script.

Ответ 6

Простыми словами (в основном для новичков в кодировании), мы можем сказать,

`return` : exits the function,
`exit()` : exits the program(called as process while running)

Также, если вы заметили, это очень просто, но...,

`return` : is the keyword
`exit()` : is the function

Ответ 7

  • exit завершить текущий процесс; с кодом выхода или без него, рассмотрите эту систему больше, чем программную функцию. Обратите внимание, что при поиске exit закончится оболочка, однако при запуске будет exit script.

  • return от функции вернитесь к инструкции после вызова, с кодом возврата или без него. return является необязательным и подразумевается в конце функции. return может использоваться только внутри функции.

Я хочу добавить, что, будучи источником, нелегко exit script изнутри функции, не убивая оболочку. Я думаю, пример лучше на "тесте" script

#!/bin/bash
function die(){
   echo ${1:=Something terrible wrong happen}
   #... clean your trash
   exit 1
}

[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"

делает следующее:

user$ ./test
Whatever is not available
user$

test - и- оболочка закроется.

user$ . ./test
Whatever is not available

только test завершится, и появится подсказка.

Решение состоит в том, чтобы заключить потенциальную процедуру в ( и )

#!/bin/bash
function die(){
   echo $(1:=Something terrible wrong happen)
   #... clean your trash
   exit 1
}

( # added        
    [ -f /whatever/ ] || die "whatever is not available"
    # now we can proceed
    echo "continue"
) # added

теперь, в обоих случаях только test выйдет.

Ответ 8

Вопрос OP: В чем разница между оператором возврата и выхода в функциях BASH относительно кодов выхода?

Во-первых, требуется пояснение:

  • Оператор (return | exit) не требуется для прекращения выполнения (function | shell). Функция (функция | shell) завершится, когда достигнет конца списка кодов, даже без оператора (return | exit).
  • Оператор (return | exit) не требуется для передачи значения обратно из завершенного (function | shell). Каждый процесс имеет встроенную переменную $? который всегда имеет числовое значение. Это специальная переменная, которая не может быть установлена как "? = 1", но устанавливается только специальными способами (см. Ниже *). Значение $? после последней команды, которая должна быть выполнена в (вызываемой функции | вложенной оболочке) - значение, которое передается обратно (вызывающая функция | родительская оболочка). Это верно независимо от того, является ли последняя выполненная команда ("return [n]" | "exit [n]")) или простой ("return", или что-то еще, что оказывается последней командой в коде вызываемых функций).

В приведенном выше списке маркеров выберите из "(x | y)" либо всегда первый элемент, либо всегда второй элемент, чтобы получить инструкции о функциях & return или shells & exit соответственно.

Что ясно, так это то, что они оба часто используют специальную переменную $? передать значения вверх после того, как они заканчиваются.

* Теперь о специальных способах, которые $? можно установить:

  • Когда вызываемая функция завершается и возвращает вызывающую функцию, тогда $? в звонилке будет равно итоговое значение $? в завершенной функции.
  • Когда родительская оболочка имплицитно или явно ожидает единственную вложенную оболочку и освобождается по окончании этой вспомогательной оболочки, тогда $? в родительской оболочке будет равно окончательное значение $? в завершенной субоболочке.
  • Некоторые встроенные функции могут изменять $? в зависимости от их результата. Но некоторые этого не делают.
  • Встроенные функции "возврат" и "выход", когда после числового аргумента указывается $? с аргументом и прекратить выполнение.

Стоит отметить, что $? можно присвоить значение, вызвав exit в вложенной оболочке, например так:

# (exit 259)
# echo $?
3  

Ответ 9

Прежде всего, return - это ключевое слово, а exit мой друг - это функция.

Итак, здесь простейшее объяснение.

return Он возвращает значение из функции.

exit Он выходит из текущей оболочки или покидает ее.