Разница между return и exit в функциях Bash



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

880   9  

9 ответов:

С man bash on return [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

    Ничего не найдено.