Cómo llamar a funciones bash

28

Tal vez estoy mirando esto de la manera incorrecta ... Pero aquí estoy lo que estoy tratando de hacer. Realizo la mayor parte de mi trabajo con Java pero solo cambié a un entorno unix (bash). Yo estoy haciendo esto:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

Pero tengo dos funciones en mi archivo y quiero poder llamarlas por separado desde la línea de comandos. Es decir: myFunc.ls2()o incluso solo ls2. Sé que puedo agregar las funciones a mi .bashrcarchivo, pero ¿hay alguna otra forma de ejecutar estas funciones sin agregarlas a mi .bashrc?

Sixtyfootersdude
fuente

Respuestas:

25

Una forma de hacer esto, que implica escribir un poco más, es a través del sourcecomando. Para llamar a una función desde myFunc, podría usar source myFunc; ls2y generaría Hello World.

Entonces, por ejemplo, tengo un archivo llamado say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

ahora quiero llamar a su talk()función desde la línea de comando:

[John @ impresionante ~] $ fuente say.sh; hablar
¡Hola!

llamarlo desde otro script bash:

#!/bin/bash
source say.sh
talk

También puede colocar cada uno en un script separado y agregarlos en un directorio que está en su variable PATH.

así, por ejemplo, en un script llamado hellotendrías

#!/bin/bash
echo "Hello World"

ahora póngalo en uno de los directorios en su RUTA, que puede ver ejecutando echo $PATH. Puede agregar otro directorio a su RUTA si lo desea o utilizar uno existente. Una vez que haya copiado el archivo allí, hágalo ejecutable con chmod +x filename.

John T
fuente
3
Para ser claros: solo tiene que obtener el archivo una vez por script o inicio de shell. Puede llamar a la función tantas veces como desee sin tener que volver a hacer referencia al archivo de origen.
Pausado hasta nuevo aviso.
5

Otro enfoque sería crear un script llamado functions.sh(en el ~/bindirectorio, por ejemplo).

En este script, agrega todas sus definiciones de funciones personales (digamos que cada vez que agrega una función la agrega a este archivo ...)

Finalmente solo tiene que agregar la source ~/bin/functions.shlínea a su .bashrcarchivo. De esta manera podrá llamarlos desde la línea de comandos, .bashrcpermanecerá limpio y tendrá un lugar específico para sus funciones personales.

Depurador
fuente
5

Si eres como yo, no quieres saturar tu entorno con funciones. También tiene un grupo de funciones que pertenecen juntas en términos de lo que hacen, por lo que tiene sentido colocarlas en el mismo archivo de script. (Sé que una carpeta con varios archivos podría servir para el mismo propósito). Aquí hay una posible solución que le permite llamar a una función específica en el script:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$
Mike Wodarczyk
fuente
Me gusta mucho más que sourceeso, ya que puede manejar tener dos funciones del mismo nombre en dos archivos sh diferentes. Lo refiné para manejar una cantidad arbitraria de parámetros reemplazándolos $1 $2 $3 $4 $5conFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur el
@ChuckWilbur: ¿Por qué saltar a través de aros? Simplemente cambie la última línea a "$@". PD: su enfoque es realmente incorrecto; la última parte debe ser "$FUNC_CALL" "$@"  (es decir,  $FUNC_CALLdebe estar entre comillas).
Scott
¿Qué es "$FUNC_CALL"?
ctrl-alt-delor