¿Cómo vuelves a un script bash de origen?

Utilizo un script que se extiende con la función de fuente bash;

#!/bin/bash source someneatscriptthatendsprematurely.sh 

Me gustaría poder regresar de esa secuencia de comandos sin romper el guión principal.

El uso de saltos de salida del guión principal, el retorno solo es válido en funciones y la experimentación con $ (salida 1) tampoco parece funcionar.

Entonces, ¿es posible regresar en un script sub-bash sin romper el bash principal?

Cualquier ayuda apreciada!

Necesita la statement de return :

return [n]

Hace que una función salga con el valor de retorno especificado por n . Si se omite n , el estado de retorno es el del último comando ejecutado en el cuerpo de la función. Si se usa fuera de una función, pero durante la ejecución de un script por . (fuente), provoca que el shell deje de ejecutar ese script y devuelva n o el estado de salida del último comando ejecutado en el script como el estado de salida del script. Si se usa fuera de una función y no durante la ejecución de una secuencia de comandos de . , el estado de retorno es falso. Cualquier comando asociado con la captura RETORNO se ejecuta antes de que se reanude la ejecución después de la función o la secuencia de comandos.

Puedes ver esto en acción con los siguientes dos scripts:

 script1.sh: . script2.sh echo hello again script2.sh: echo hello return echo goodbye 

Cuando ejecuta script1.sh , ve:

 hello hello again 

¿Es importante que puedas cambiar las variables de entorno? De lo contrario, puede ejecutar el script ejecutándolo sin fuente:

 someneatscriptthatendsprematurely.sh 

Tuve el mismo problema ahora

Me di cuenta de que agregar una función de verificación y devolver eso no devolverá la función a su interlocutor, por ejemplo.

En bash_functions

 function install_packer_linux() { check_wget && check_unzip wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip unzip packer_1.1.2_linux_amd64.zip mv packer ~/.local/bin rm -f packer_1.1.2_linux_amd64.zip } function check_unzip() { if ! [ -x "$(command -v unzip)" ]; then echo "Error: unzip is not installed" return 1 else return 0 fi } function check_wget() { if ! [ -x "$(command -v wget)" ]; then echo "Error!: wget is not installed" return 1 else return 0 fi } $ source ~/.bash_functions 

Lo que sucede aquí es que las fichas son el único lugar donde se devuelve, por lo que install_packer_linux continuará

Entonces puedes hacer dos cosas aquí. Mantenga el formato actual (función que llama a otra función) tal como está y evalúe usando el valor de verdad y luego regrese si los valores no son ciertos o vuelva a escribir el verificador en la función principal installer_packer_linux

Truthy:

 function install_packer_linux() { check_wget && check_unzip || return wget https://releases.hashicorp.com/packer/1.1.2/packer_1.1.2_linux_amd64.zip unzip packer_1.1.2_linux_amd64.zip mv packer ~/.local/bin rm -f packer_1.1.2_linux_amd64.zip } 

Aviso que agregamos || regresar después de los cheques y concatenar los cheques usando &&, de modo que si no ambos cheques son verdaderos devolvemos la función