¿Cómo se puede volver a un origen de script de bash?

Yo uso un script que se extiende el uso de la bash característica de origen;

#!/bin/bash

source someneatscriptthatendsprematurely.sh

Me gustaría ser capaz de volver de esa secuencia, sin romper el script principal.

Utilizando la salida se rompe el script principal, el retorno no es válido en las funciones y experimentando con $(salida 1) no parece funcionar bien.

Así, es posible regresar en una sub-secuencia de comandos bash sin romper los principales bash?

Cualquier ayuda apreciada!

  • Respuesta de paxdiablo es perfecto y debe ser aceptado.
InformationsquelleAutor codar | 2010-09-08

3 Kommentare

  1. 70

    Usted necesita el return declaración:

    return [n]

    Provoca una función para salir con el valor de retorno especificado por n. Si n se omite, el estado de retorno es el de la última orden ejecutada en el cuerpo de la función. Si se utiliza fuera de una función, pero durante la ejecución de un script por el . (fuente) de comandos, el shell para detener la ejecución de script y devolver n o el estado de salida de la última orden ejecutada dentro de la secuencia de comandos como el estado de salida de la secuencia de comandos. Si se utiliza fuera de una función y no durante la ejecución de un script por ., el estado de retorno es falso. Cualquier comando asociado con el RETORNO de la trampa se ejecuta antes de la ejecución se reanuda después de la función o script.

    Usted puede ver esto en acción con las dos siguientes secuencias de comandos:

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

    Cuando se ejecuta script1.sh, ver:

    hello
    hello again
    • Tenga en cuenta que usted debe return 0 explícitamente por defecto si se puede. No hacerlo puede causar su mal comportamiento en el guión principal. es decir, [ -z "non-existant-file" ] && return realmente volver 1.
    • el problema con su ejemplo de ello es que [ -z "non-existant-file" ] && return 0 devolverá 1. Así que decirle a la gente explícitamente return 0 y, a continuación, muestra un ejemplo en el que no funciona es confuso.
    • Brett, que en realidad no importa en el ejemplo que he publicado ya la convocatoria de secuencia de comandos en realidad no comprobar el valor devuelto de alguna manera (a través, por ejemplo, if, $? o set -e). En cualquier caso, estoy bastante seguro de que la cita que incluye hace que el comportamiento claro en ese caso.
  2. 1

    Es importante que usted puede cambiar las variables de entorno? Ya que de lo contrario usted puede simplemente ejecutar la secuencia de comandos al ejecutar sin fuente:

    someneatscriptthatendsprematurely.sh
  3. 0

    Tuve el mismo problema solo que ahora

    Me di cuenta de que la adición de un comprobador de función y devolver que no también de retorno de la función en su llamada, por ejemplo.

    Sobre 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 pasa aquí es que ya las damas es el único lugar en el vuelto tan install_packer_linux seguirá

    Así que usted puede hacer dos cosas aquí. Mantener el formato actual (función llama a otra función) como es y evaluar el uso de truthy valor de retorno si los valores no son truthy o reescribir el corrector en las principales installer_packer_linux función

    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 hemos añadido || regreso después de las comprobaciones y se concatenan los cheques con &&
    así que si no ambos controles son truthy volvemos a la función

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea