2010-09-08 7 views
35

Uso una secuencia de comandos que se extiende con la función fuente de bash;¿Cómo se regresa a un script bash de origen?

#!/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 script principal, el retorno solo es válido en las funciones y la experimentación con $ (salida 1) tampoco parece funcionar.

Entonces, ¿es posible volver en un guión sub-bash sin romper el bash principal?

¡Cualquier ayuda apreciada!

+0

La respuesta de paxdiablo es perfecta y debe ser aceptada. – Tino

Respuesta

52

Se necesita el comunicado return:

return [n]

causa una función para salir con el valor de retorno especificada 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 mediante el comando . (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 estado de salida de la secuencia de comandos. Si se usa fuera de una función y no durante la ejecución de una secuencia de comandos por ., el estado de devolución 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.

Esto se puede ver en acción con los dos guiones siguientes:

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

Cuando se ejecuta script1.sh, que se ve:

hello 
hello again 
+4

Tenga en cuenta que debe 'devolver 0' explícitamente por defecto si puede. No hacerlo puede causar un comportamiento no deseado en el script primario. es decir, '[-z" non-existant-file "] && return' en realidad devolverá 1. –

+1

@BrettRyan el problema con su ejemplo es que' [-z "non-existant-file"] && return 0' devolverá 1 Así que decirle a la gente que 'devuelva 0 'explícitamente y luego mostrar un ejemplo en el que eso no funciona es confuso. – Segfault

+0

Brett, eso en realidad no importa en el ejemplo que publiqué ya que el script de llamada en realidad no verifica el valor de retorno de ninguna manera (a través, por ejemplo, 'if',' $? 'O' set -e') . En cualquier caso, estoy bastante seguro de que la cita que incluí aclara el comportamiento en ese caso. – paxdiablo

1

¿Es importante que usted puede cambiar las variables de entorno? Pues de lo contrario sólo puede ejecutar el script ejecutándolo sin fuente:

someneatscriptthatendsprematurely.sh 
0

que tenían el mismo problema hace un momento

me di cuenta de que la adición de una función de corrector y devolver que no Volverá también la función de su llamador, 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 desde las fichas es el único lugar de su volvieron tan install_packer_linux va a seguir siendo

lo que puede hacer dos cosas aquí.O bien mantener el formato actual (función llama a otra función) como es y evaluar utilizando el valor Truthy luego regresar si los valores no son Truthy o reescribir el corrector sobre 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 nos agregado || devuelva después de los cheques y concatene los cheques usando & & así que si no ambas verificaciones son verdaderas devolvemos la función

Cuestiones relacionadas