He definido una bash
función en mi ~/.bashrc
archivo. Esto me permite usarlo en terminales de shell. Sin embargo, no parece existir cuando lo llamo desde un script.
¿Cómo puedo definir una bash
función para que la utilicen también los scripts?
bash
shell-script
function
Onturenio
fuente
fuente
/bin/sh
en la línea shebang?Respuestas:
~/.bash_profile
y~/.bashrc
no son leídos por scripts, y las funciones no se exportan por defecto. Para hacerlo, puede usarexport -f
así:export -f foo
también podría llamarse~/.bash_profile
para que esta función esté disponible para los scripts después de iniciar sesión. Ten en cuenta queexport -f
no es portátil.Una mejor solución sería obtener el archivo que contiene la función usando
. file
. Esto es mucho más portátil y no depende de que su entorno esté configurado de una manera particular.fuente
function myFunction { ... }
en~/.bash_profile
y estás listo?export
solución parece funcionar correctamente. Gracias.foo
función de algunosfile
2) Puede controlar mejor el contenido de esofile
que asegurarse de que el shell de invocación no cambiófoo
antes de invocar su script. Puede agregar controles de seguridadfile
para asegurarse de que no esté sujeto, por ejemplo. (No es fácil, pero posible). (bueno, también podrías hacer esas verificaciones en la función foo definida ... pero entiendes ^^ Creo que el método 2 es más limpio). 3)file
solo contendrá lo que se necesita, no más..bashrc
solo se lee mediante shells interactivos. (En realidad, eso es una simplificación excesiva: bash es peculiar a este respecto. Bash no lee.bashrc
si es un shell de inicio de sesión, interactivo o no. Y hay una excepción incluso a la excepción: si el proceso padre de bash esrshd
osshd
, entonces bash lee.bashrc
, ya sea interactivo o no)Coloque las definiciones de sus funciones en un archivo en un lugar conocido y use el
.
(source
incorporado también deletreado ) para incluir ese archivo en un script.Si lo desea, puede seguir la función de carga automática de ksh. Coloque cada definición de función en un archivo con el mismo nombre que la función. Enumere los directorios que contienen las definiciones de funciones en la
FPATH
variable (una lista de directorios separados por dos puntos). Aquí hay una aproximación cruda de kshautoload
que realmente carga la función inmediatamente en lugar de bajo demanda:fuente
¿ Necesitas una función? Si no es así, considere extraer la lógica en un script Bash independiente e independiente en su
$PATH
. Por ejemplo, tuve esto en mi~/.bashrc
:~/bin
está en mi$PATH
, así que creé~/bin/wanip
con los siguientes contenidos:Y corrió
chmod 0755 ~/bin/wanip
para hacerlo ejecutable. Ahora puedo ejecutarwanip
desde otros scripts.Me gusta tener
wanip
un script Bash independiente. Me recuerda que quiero que esta lógica esté generalmente disponible (además de solo en mi sesión interactiva actual de Bash). El script encapsula muy bien la lógica y la documentación para el mismo.fuente