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которая была убита, когда она есть (большинство оболочек не могут получить эту информацию в любом случае).