variable una sirve script resultado que pasar parametros para guardar funciones entorno cómo con comando bash function shell exit

bash - una - pasar parametros shell script



Salir de la pila de funciones sin salir del shell (5)

Deberá agregar declaraciones de return a cada una de sus funciones para verificar el valor de retorno de cualquier función que llamen por turno. Obtener un archivo es como cortar y pegar el código en el contexto actual, con la pequeña excepción de variables como $BASH_SOURCE .

Alternativamente, podría definir fn como un script de shell, de modo que la exit haga lo que quiera (a menos que un fork sea demasiado costoso).

Estaba escribiendo un guión y luego me encontré con un problema extraño. Si obtengo una secuencia de comandos que contiene un montón de funciones que pueden llamar a una función de error que genera una cadena y luego sale, saldrá de mi shell. Sé por qué lo hace. Esto se debe a que una llamada a la función está en el mismo espacio de proceso que la persona que llama (al menos está en bash), por lo que la salida dentro de la función termina el proceso actual con el código de salida proporcionado. Ejemplo:

error() { echo $1 exit 1 } fn() { if [ $# == 0 ]; then error "Insufficient parameters." fi # do stuff } $ fn Insufficient parameters. [shell terminates]

Entonces, mi pregunta es, ¿puedo salir de todas las funciones en la pila de funciones sin terminar el shell actual y sin generar una nueva subshell?

Gracias


El shell no tiene realmente un mecanismo de excepción para rebobinar a través de muchas llamadas de función a la vez. Solo tiene que verificar los valores de retorno y regresar manualmente hasta el final.


Para salir de la pila de funciones sin salir del shell, se puede usar el comando:

kill -INT $$

Como dijo la pizza , esto es como presionar Ctrl-C, que detendrá la ejecución de la secuencia de comandos actual y lo llevará al símbolo del sistema.

Nota: la única razón por la que no seleccioné la respuesta de la pizza es porque esto se ocultó en su respuesta y no se respondió directamente.


puedes hacer un

exit() { return $1;}

entonces

source ./your_script

En respuesta a los escépticos, esto solo afecta al shell actual, no afecta a los shells que usted genera.

La forma más informativa puede ser

exit() { local ans local line read -p "You really want to exit this? " line ans=$(echo $line) case "$ans" in Y);; y);; *)kill -INT $$;; esac unset -f exit exit $1 }


usando la declaración de return , pero necesita agregar retorno después de llamar al error