Come chiamare le funzioni bash


28

Forse sto guardando questo nel modo sbagliato .. Ma ecco cosa sto cercando di fare. Faccio la maggior parte del mio lavoro con Java ma sono passato a un ambiente unix (bash). Lo sto facendo:

[~/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

Ma ho due funzioni nel mio file e voglio essere in grado di chiamarle separatamente dalla riga di comando. Vale a dire: myFunc.ls2()o anche solo ls2. So che posso aggiungere le funzioni al mio .bashrcfile ma esiste un altro modo per eseguire queste funzioni senza aggiungerle al mio .bashrc?

Risposte:


26

Un modo per farlo, che comporta un po 'più di digitazione, è tramite il sourcecomando. Per chiamare una funzione da myFunc potresti usare source myFunc; ls2e genererebbe Hello World.

Quindi, ad esempio, ho un file chiamato say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

ora voglio chiamare la sua talk()funzione dalla riga di comando:

[john @ awesome ~] $ source say.sh; parlare
Ciao!

per chiamarlo da un altro script bash:

#!/bin/bash
source say.sh
talk

Puoi anche metterli ciascuno in uno script separato e aggiungerli in una directory che si trova nella tua variabile PATH.

quindi ad esempio, in uno script chiamato helloavresti:

#!/bin/bash
echo "Hello World"

ora inseriscilo in una delle directory del tuo PERCORSO, che puoi visualizzare eseguendo echo $PATH. Puoi aggiungere un'altra directory al tuo PERCORSO se desideri o utilizzarne una esistente. Dopo aver copiato il file lì, rendilo eseguibile con chmod +x filename.


3
Giusto per essere chiari: devi solo eseguire il source del file una volta per script o avvio della shell. È possibile chiamare la funzione tutte le volte che si desidera, senza fare nuovamente riferimento al file di origine.
In pausa fino a nuovo avviso.

5

Un altro approccio sarebbe quello di creare uno script chiamato functions.sh(nella ~/bindirectory per esempio).

In questo script, aggiungi tutte le definizioni delle tue funzioni personali (diciamo che ogni volta che aggiungi una funzione la aggiungi a questo file ...)

Finalmente devi solo aggiungere la source ~/bin/functions.shlinea al tuo .bashrcfile. In questo modo sarai in grado di chiamarli dalla riga di comando, .bashrcrimarrai pulito e avrai un posto specifico per le tue funzioni personali.


5

Se sei come me, non vuoi ingombrare il tuo ambiente con funzioni. Hai anche un gruppo di funzioni che appartengono insieme in termini di ciò che fanno, quindi metterle nello stesso file di script ha senso. (So ​​che una cartella con più file potrebbe servire allo stesso scopo). Ecco una possibile soluzione che ti consente di chiamare una funzione specifica nello 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    
$

Mi piace molto di più rispetto a sourcequando può gestire due funzioni con lo stesso nome in due diversi file sh. L'ho perfezionato per gestire un numero arbitrario di parametri sostituendolo $1 $2 $3 $4 $5conFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur, il

@ChuckWilbur: Perché saltare attraverso i cerchi? Basta cambiare l'ultima riga in "$@". PS Il tuo approccio è in realtà sbagliato; l'ultima parte dovrebbe essere "$FUNC_CALL" "$@"  (cioè  $FUNC_CALLdovrebbe essere tra virgolette).
Scott,

Che cosa è "$FUNC_CALL"?
ctrl-alt-delor

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.