9 ответов:
С
man bashonreturn [n];останавливает выполнение функции и возвращает вызывающему ее объекту значение, указанное параметром n. Если N опущено, то возвращается состояние последней команды, выполненной в теле функции.
... на
exit [n]:вызвать консоль для выхода в состояние N. Если N не указано, состояние выхода является то, что последней из выполнявшихся команд. Ловушка на выходе выполняется раньше оболочка завершается.
EDIT:
согласно вашему редактированию вопроса, относительно кодов выхода,
returnне имеет ничего общего с коды выхода. Коды выхода предназначены для приложения/скрипты, а не функции. Поэтому в этом отношении единственное ключевое слово, которое задает код выхода скрипта (тот, который может быть пойман вызывающей программой с помощью$?переменной оболочки) составляетexit.изменить 2:
мое последнее заявление по поводу
exitвызывает некоторые замечания. Это было сделано, чтобы дифференцироватьreturnиexitдля понимания ОП, а на самом деле, при любой заданная точка скрипта программы / оболочки,exitэто единственный способ завершить скрипт с кодом выхода из вызывающего процесса.каждая команда, выполняемая в оболочке, создает локальный "код выхода": он устанавливает
$?переменная к этому коду, и может использоваться сif,&&и другие операторы для условного выполнения других команд.эти коды выхода (и стоимостью
$?переменная) сбрасываются при каждом выполнении команды.кстати, код выхода последней команды, выполненной сценарием, используется в качестве кода выхода самого сценария, как видно из вызывающего процесса.
наконец, функции при вызове действуют как команды оболочки относительно кодов выхода. Код выхода функции (внутри функция) устанавливается с помощью
return. Так что когда в функцииreturn 0выполняется, выполнение функции завершается, давая код выхода 0.
returnвызовет текущую функцию, чтобы выйти из области действия, в то время какexitприведет к завершению сценария в точке, где он вызывается. Вот пример программы, чтобы помочь объяснить это:#!/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()
Я не думаю, что кто действительно полностью ответил на вопрос, потому что они не описывают, как они используются. Хорошо, я думаю, что мы знаем, что exit убивает скрипт, где бы он ни вызывался, и вы можете назначить ему статус, такой как exit или exit 0 или exit 7 и так далее. Это может быть использовано для определения того, как сценарий был вынужден остановиться, если вызывается другим сценарием и т. д. Достаточно на выходе.
return при вызове вернет значение, указанное для указания функции поведение, обычно 1 или 0. Например:
#!/bin/bash isdirectory() { if [ -d "" ] then return 0 else return 1 fi echo "you will not see anything after the return like this text" }проверить такой:
if isdirectory ; then echo "is directory"; else echo "not a directory"; fiили такой:
isdirectory || echo "not a directory"в этом примере тест может использоваться для указания, был ли найден каталог. обратите внимание, что ничего после возврата не будет выполняться в функции. 0-это истина, но ложь-это 1 в оболочке, в отличие от других проговоров.
подробнее о функции: http://www.linuxjournal.com/content/return-values-bash-functions
Примечание: функция isdirectory предназначена только для учебных целей. Это не должно быть так, как вы выполняете такую опцию в реальном скрипте.
помните, что функции являются внутренними для скрипта и обычно возвращаются оттуда, откуда они были вызваны с помощью оператора return. Вызов внешнего скрипта-это совсем другое дело, и сценарии обычно завершаются с помощью оператора exit.
разница "между оператором return и exit в функциях BASH относительно кодов выхода" очень мала. Оба возвращают статус, не значения таковой. Статус ноль указывает на успех, в то время как любой другой статус (От 1 до 255) указывает на сбой. Оператор return вернется к сценарию, откуда он был вызван, в то время как оператор exit завершит весь сценарий, где бы он ни встречался.
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).Если ваша функция просто заканчивается без оператора return, статус последней выполненной команды возвращается как код состояния (и будет помещен в
$?).помните, возврат и выход возвращают код состояния от 0 до 255, доступный в
$?. Нельзя вставьте что-нибудь еще в код состояния (например, Верните "cat"); он не будет работать. Но сценарий может передать обратно 255 различных причин сбоя с помощью кодов состояния.вы можете установить переменные, содержащиеся в вызывающем скрипте, или эхо-результаты в функции и использовать подстановку команд в вызывающем скрипте; но цель возврата и выхода-передать коды состояния, а не значения или результаты вычислений, как можно было бы ожидать на языке программирования, таком как C.
иногда, вы запускаете скрипт через
.илиsource.. a.shесли вы включили
exitнаa.sh, он не просто завершит скрипт, но и завершит сеанс оболочки.если вы включите
returnнаa.sh, Он просто перестает обрабатывать скрипт.
простыми словами (в основном для новичков в кодировании), мы можем сказать,
`return` : exits the function, `exit()` : exits the program(called as process while running)также, если вы заметили, это очень простой, но...,
`return` : is the keyword `exit()` : is the function
exitзавершить текущий процесс; С кодом выхода или без него, считайте это системой больше, чем функцией программы. Обратите внимание, что при поиске,exitзавершит оболочку, однако, при запуске будет простоexitсценарий.
returnиз функции вернуться к инструкции после вызова, с кодом возврата или без него.returnявляется необязательным и это само собой подразумевается в конце функции.returnтолько может быть используется внутри функции.я хочу добавить, что, будучи источником, это не так просто
exitскрипт из функции, не убивая оболочки. Я думаю, пример лучше на тестовом скрипт#!/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выйдет.
прежде всего,
returnключевое слово иexitмой друг-функции.тем не менее, вот самое простое объяснение.
returnОн возвращает значение из функции.
exitОн выходит из текущей оболочки или покидает ее.
вопрос ОП: В чем разница между оператором return и exit в функциях BASH относительно кодов выхода?
во-первых, требуется некоторое уточнение:
- оператор (return|exit) не требуется для завершения выполнения (функции|оболочки). A (функция|оболочка) завершится, когда он достигнет конца своего списка кодов, даже без оператора (return|exit).
- оператор (return|exit) не требуется для передачи значения назад от завершенного (функция / оболочка). Каждый процесс имеет встроенную переменную $? который всегда имеет числовое значение. Это специальная переменная, которая не может быть установлена как "?=1", но устанавливается только специальными способами (см. ниже *). Значение $? после последней команды, которая должна быть выполнена в (вызываемой функции | суб оболочки) является значение, которое передается обратно в (вызывающей функции | родительской оболочки). Это верно независимо от того, выполняется ли последняя команда ("return [n]"| "exit [n]") или обычная ("return" или что-то еще остальное, которое оказывается последней командой в коде вызываемых функций.
в приведенном выше списке маркеров выберите из "(x / y)" либо всегда первый элемент, либо всегда второй элемент, чтобы получить инструкции о функциях & return или shells & exit соответственно.
что ясно, что они оба разделяют общее использование специальной переменной $? чтобы передать значения вверх после их завершения.
* теперь для специальных способов, что $? может быть набор:
- когда вызываемая функция завершается и возвращается к своему вызывающему объекту, то $? в вызывающем будет равно конечное значение $? в завершенной функции.
- когда родительская оболочка неявно или явно ожидает на одной подшелле и освобождается путем завершения этой подшеллы, то $? в родительской оболочке будет равно конечному значению $? в прекращается-образного корпуса.
- некоторые встроенные функции могут изменять $? в зависимости от их результат. Но некоторые этого не делают.
- встроенные функции "return" и "exit", когда за ними следует числовой аргумент как $? с аргументом, и завершить выполнение.
стоит отметить, что $? может быть присвоено значение путем вызова exit в суб оболочки, как это:
# (exit 259) # echo $? 3
Comments