2012-01-11 16 views

Respuesta

30

Si el script sólo define las funciones y no hace nada más, primero se puede ejecutar el script en el contexto de la cáscara actual usando el comando source o . y luego simplemente llamar a la función. Vea help source para más información.

+0

El único problema con este método es que si usa 'exit' en su función, cerrará el terminal después de que se ejecute la función. ¿Hay alguna forma de evitar esto? @SvenMarnach – user1527227

+0

@ user1527227: Vaya con la siguiente respuesta en ese caso, dado que tiene el control del script de shell. Si no lo hace, puede llamar a una subshell interactiva primero (simplemente ingrese 'bash'), y' exit' solo terminará la subshell, pero no su terminal. –

15

El siguiente comando registra primero la función en el contexto, entonces lo llama:

. ./myScript.sh && func() 
6

En pocas palabras, no.

Puede importar todas las funciones de la secuencia de comandos a su entorno con source (help source para obtener más información), lo que le permitirá llamarlas. Esto también tiene el efecto de ejecutar el script, así que ten cuidado.

No hay forma de invocar una función desde un script de shell como si fuera una biblioteca compartida.

+0

Creo que esto debería tener más peso como respuesta adecuada. Traté de hacer algo similar a lo que el OP necesita, pero el scripting de shell simplemente no está diseñado para "clean-cut, OOP development" (IMHO). –

123

Bueno, si bien las otras respuestas son correctas, puedes hacer otra cosa: si tienes acceso al script bash, puedes modificarlo y simplemente colocar al final el parámetro especial "[email protected]", que se expandirá al argumentos de la línea de comando que especifique, y dado que está "solo", el intérprete intentará llamarlos textualmente; y aquí podría especificar el nombre de la función como primer argumento. Ejemplo:

$ cat test.sh 
testA() { 
    echo "TEST A $1"; 
} 

testB() { 
    echo "TEST B $2"; 
} 

"[email protected]" 


$ bash test.sh 
$ bash test.sh testA 
TEST A 
$ bash test.sh testA arg1 arg2 
TEST A arg1 
$ bash test.sh testB arg1 arg2 
TEST B arg2 

Por polaco, primero puede comprobar que existe el comando y es una función:

# Check if the function exists (bash specific) 
if declare -f "$1" > /dev/null 
then 
    # call arguments verbatim 
    "[email protected]" 
else 
    # Show a helpful error 
    echo "'$1' is not a known function name" >&2 
    exit 1 
fi 
+12

Use '" $ @ "' en la mayoría de los casos. '$ @' no es seguro en algunos casos. – fumiyas

0

Editar: ADVERTENCIA - Parece esto no funciona en todos los casos, pero funciona bien en muchos guiones públicos.

Si usted tiene un script bash llamado "control" y en su interior que ha llamado una función de "construir":

function build() { 
    ... 
} 

Entonces se le puede llamar así (desde el directorio donde está):

./control build 

Si es dentro de otra carpeta, que haría:

another_folder/control build 

Si el archivo i llama "control.sh", que en consecuencia hacer que la función se puede llamar así:

./control.sh build 
0

Tengo una situación donde necesito una función de escritura del golpe que no deben ejecutarse antes (por ejemplo, por source) y el problema con @$ es que myScript.sh se ejecuta dos veces, parece ...Así que he llegado con la idea de conseguir la función con SED:

sed -n "/^func()/,/^}/p" myScript.sh

Y para ejecutarlo en el momento que lo necesite, lo puse en un archivo y utilizar source:

sed -n "/^func()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh

Cuestiones relacionadas