Sí; puedes usar return
en lugar de exit
. Su propósito principal es regresar desde una función de shell, pero si lo usa dentro de un source
-d script, regresa de ese script.
Como §4.1 "Bourne Shell Builtins" del Manual de referencia de Bash lo pone:
return [n]
Hacer que una función de shell salga con el valor de retorno n .Si n no se proporciona, el valor devuelto es el estado de salida del último comando ejecutado en la función. Esto también se puede usar para terminar la ejecución de un script que se está ejecutando con el
.
(osource
) integrado, devolviendo n o el estado de salida del último comando ejecutado dentro del script como el estado de salida del script. Cualquier comando asociado con elRETURN
trap se ejecuta antes de que la ejecución se reanude después de la función o secuencia de comandos. El estado de retorno es distinto de cero sireturn
se usa fuera de una función y no durante la ejecución de un script por.
osource
.
En lugar de ejecutar el script usando . run2.sh
, puedes ejecutarlo usando sh run2.sh
o bash run2.sh
Se iniciará un nuevo sub-shell, para ejecutar el script entonces, se cerrará al final del script dejando el otro shell abierto.
El "problema" realmente es que está obteniendo y no ejecutando el script. Cuando obtiene un archivo, su contenido se ejecutará en el shell actual, en lugar de generar un subshell. Así que todo, incluida la salida, afectará al shell actual.
En lugar de usar exit
, querrá usar return
.
Puede agregar un comando de salida adicional después de la declaración/comando de retorno para que funcione para ambos, ejecutando el script desde la línea de comando y aprovisionándose desde la terminal.
Ejemplo de código de salida en el script:
if [ $# -lt 2 ]; then
echo "Needs at least two arguments"
return 1 2>/dev/null
exit 1
fi
La línea con el exit
el comando no se llamará cuando obtenga el script después del return
comando.
Cuando ejecuta el script, return
comando da un error. Entonces, suprimimos el mensaje de error reenviándolo a /dev/null
.