Чтобы избежать путаницы, не думайте / не говорите о нем как о возвращаемом значении, думайте о нем как о том, что это такое - статус выхода.
В большинстве языков программирования вы можете зафиксировать возвращаемое значение функции, записав все, что эта функция возвращает в переменную, например, с C-подобным языком:
int foo() {
printf("35\n");
return 7;
}
void main() {
int var;
var=foo();
}
переменная var
в main()
после вызова foo()
будет содержать значение 7
, и 35
будет напечатано в стандартный вывод. Однако в оболочке с похожим кодом:
foo() {
printf "35\n"
return 7
}
main() {
local var
var=$(foo)
}
var
будет иметь значение 35
, а неизменяемая встроенная переменная $?
, которая всегда содержит состояние выхода последнего запуска команды , будет иметь значение 7
. Если вы хотите продублировать поведение C, где 35 идет в стандартный вывод, а var содержит 7, тогда это будет:
foo() {
printf "35\n"
return 7
}
main() {
local var
foo
var=$?
}
Тот факт, что функции оболочки используют ключевое слово return
, чтобы сообщать о своем статусе выхода, сначала сбивает с толку, если вы привыкли к другим языкам на основе Алгола, таким как C, но если они использовали exit
, то это приведет к завершению всего процесс, поэтому они должны были использовать что-то, и быстро становится очевидно, что это на самом деле означает.
Поэтому, когда речь идет о сценариях и функциях оболочки, используйте слова «output» и «exit status», а не «return», что некоторые люди в некоторых контекстах предполагают, что означает любую из этих двух вещей, и это позволит избежать путаницы.
Кстати, чтобы не усложнять ситуацию, я сказал выше, что $?
- это переменная, но на самом деле это значение «специального параметра» ?
. Если вы действительно хотите понять разницу сейчас, смотрите https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameters для обсуждения параметров оболочки, которые включают в себя «специальные параметры», такие как ?
и #
, «позиционные параметры», такие как 1
и * 1036. * и "переменные", такие как HOME
и var
, используемые в моем сценарии выше.