return
как правило , не принимает никаких опций ( ksh93
«s принимает обычный --help
, --man
, --author
... хотя). Единственный ожидаемый аргумент (необязательный) - это код возврата. Диапазон принятых кодов возврата варьируется от оболочки к оболочке, и то, правильно ли отражено любое значение вне 0..255, $?
также зависит от оболочки к оболочке. См. Код завершения по умолчанию, когда процесс завершается? для деталей об этом.
Большинство оболочек принимают отрицательные числа ( в конце концов, аргумент передается _exit()
/ exitgroup()
системным вызовом является int
, поэтому со значениями , охватывающими , по меньшей мере -2 31 до 2 31 -1, так что имеет смысл только в том , что раковины принимают один и тот же диапазон для своих функций) ,
Большинство оболочек используют waitpid()
и. API для извлечения этого состояния выхода, однако в этом случае он усекается до числа от 0 до 255 при сохранении в $?
. Даже несмотря на то, что для вызова функции не требуется порождать процесс и использовать его waitpid()
для извлечения его состояния завершения, поскольку все выполняется в одном и том же процессе, многие оболочки также имитируют это waitpid()
поведение при вызове функций. Это означает, что даже если вы позвоните return
с отрицательным значением, $?
будет содержать положительное число.
Теперь, среди тех оболочек, которые return
принимают отрицательные числа (ksh88, ksh93, bash, zsh, pdksh и производные, отличные от mksh, yash), есть несколько (pdksh и yash), которым нужно это записать так, return -- -123
как иначе, -123
которое принимается за три -1
, -2
, -3
неверные параметры.
Поскольку pdksh и его производные (например, OpenBSD sh
или posh
) сохраняют отрицательное число в $?
, это означает, что выполнение не return "$?"
будет выполнено , если оно $?
содержит отрицательное число (что произойдет, когда последняя команда запуска была функцией, которая возвратила отрицательное число).
Так return -- "$?"
было бы лучше в этих снарядах. Однако обратите внимание, что хотя синтаксис поддерживается большинством оболочек, он не является POSIX и на практике не поддерживается производными mksh
и ash.
Итак, чтобы подвести итог, с оболочками на основе pdksh, вы можете использовать отрицательные числа в аргументах функций, но если вы это сделаете, return "$@"
не будет работать. В других оболочках return "$@"
будет работать, и вы должны избегать использования отрицательных чисел (или чисел за пределами 0..255) в качестве аргументов return
.
return
является то, что для функций, определенных какf() (...; cmd; return)
, это предотвращает оптимизацию, которую выполняют несколько оболочекcmd
в том же процессе, что и подоболочка. Для многих оболочек это также означает, что состояние выхода функции не несет информацию,cmd
которая была убита, когда она есть (большинство оболочек не могут получить эту информацию в любом случае).