Tengo un script que tiene algunas funciones.¿Cómo puedo ejecutar una función desde un script en la línea de comando?
¿Puedo ejecutar una de las funciones directamente desde la línea de comandos?
¿Algo como esto?
myScript.sh func()
Tengo un script que tiene algunas funciones.¿Cómo puedo ejecutar una función desde un script en la línea de comando?
¿Puedo ejecutar una de las funciones directamente desde la línea de comandos?
¿Algo como esto?
myScript.sh func()
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.
El siguiente comando registra primero la función en el contexto, entonces lo llama:
. ./myScript.sh && func()
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.
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). –
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
Use '" $ @ "' en la mayoría de los casos. '$ @' no es seguro en algunos casos. – fumiyas
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
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
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
@ 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. –