В чем разница между инструкциями return
и exit
в функциях Bash относительно кодов выхода?
Разница между возвратом и выходом в функциях 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
Он выходит из текущей оболочки или покидает ее.