Tengo un script que tiene algunas funciones.
¿Puedo ejecutar una de las funciones directamente desde la línea de comando?
¿Algo como esto?
myScript.sh func()
Si el script solo define las funciones y no hace nada más, primero puede ejecutar el script dentro del contexto del shell actual usando el comando source
o .
y luego simplemente llamar a la función. Consulte help source
para obtener más información.
exit
en su función, cerrará el terminal después de que se ejecute la función. ¿Hay alguna forma de evitar esto? @SvenMarnachbash
), yexit
solo terminará la subcapa, pero no su terminal.Bueno, mientras que las otras respuestas son correctas, ciertamente puede hacer otra cosa: si tiene acceso al script bash, puede modificarlo y simplemente colocar al final el parámetro especial
"$@"
, que se expandirá a los argumentos de la línea de comando usted especifica, y como está "solo", el shell intentará llamarlos literalmente; y aquí podría especificar el nombre de la función como primer argumento. Ejemplo:Para pulir, primero puede verificar que el comando existe y es una función:
fuente
"$@"
en la mayoría de los casos.$@
no es seguro en algunos casos.bash test.sh testA testB
?[ ! -z "$1" ]
cerrarse con, de lo contrario, la fuente generará la declaración else en algunas versiones de bashEl siguiente comando primero registra la función en el contexto y luego la llama:
fuente
Brevemente, no.
Puede importar todas las funciones del script a su entorno con
source
(help source
para obtener más detalles), que luego le permitirá llamarlas. Esto también tiene el efecto de ejecutar el script, así que tenga cuidado.No hay forma de llamar a una función desde un script de shell como si fuera una biblioteca compartida.
fuente
Utilizando
case
Este script ejecutará las funciones fun1 y fun2, pero si lo inicia con la opción fun1 o fun2, solo ejecutará la función dada con args (si se proporciona) y saldrá. Uso
fuente
Editar: ADVERTENCIA: parece que esto no funciona en todos los casos, pero funciona bien en muchos scripts públicos.
Si tiene un script de bash llamado "control" y dentro de él tiene una función llamada "construir":
Entonces puedes llamarlo así (desde el directorio donde está):
Si está dentro de otra carpeta, eso lo haría:
Si su archivo se llama "control.sh", eso haría que la función se pueda llamar así:
fuente
. ./control.sh && build
Tengo una situación en la que necesito una función del script bash que no debe ejecutarse antes (por ejemplo, por
source
) y el problema@$
es que myScript.sh se ejecuta dos veces, parece ... Así que se me ocurrió la idea para sacar la función con sed:sed -n "/^func ()/,/^}/p" myScript.sh
Y para ejecutarlo en el momento que lo necesito, lo guardo en un archivo y uso
source
:sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
fuente
puede llamar a la función desde el argumento de la línea de comando como se muestra a continuación
una vez que finalice la función, coloque $ 1 para aceptar el argumento, digamos que el código anterior se guarda en fun.sh para ejecutar la función ./fun.sh irfan & ./fun.sh config
fuente
Publicación resuelta, pero me gustaría mencionar mi solución preferida. Es decir, defina un script genérico de una sola línea
eval_func.sh
:Luego llame a cualquier función dentro de cualquier script a través de:
Un problema que encontré con la solución aceptada es que cuando obtengo mi script que contiene la función dentro de otro script, los argumentos de este último serían evaluados por el primero, lo que provocaría un error.
fuente