Como chamar funções bash

28

Talvez eu esteja vendo isso da maneira errada. Mas aqui estou o que estou tentando fazer. Realizei a maior parte do meu trabalho com Java, mas apenas mudei para um ambiente unix (bash). Eu estou fazendo isso:

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

Mas eu tenho duas funções no meu arquivo e quero poder chamá-las separadamente da linha de comando. myFunc.ls2()Ou seja: ou apenas ls2. Eu sei que posso adicionar as funções ao meu .bashrcarquivo, mas existe alguma outra maneira de executar essas funções sem adicioná-las ao meu .bashrc?

sixtyfootersdude
fonte

Respostas:

25

Uma maneira de fazer isso, que envolve um pouco mais de digitação, é através do sourcecomando Para chamar uma função do myFunc, você poderia usar source myFunc; ls2e ela produziria Hello World.

Por exemplo, eu tenho um arquivo chamado say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

agora eu quero chamar sua talk()função na linha de comando:

[john @ awesome ~] $ fonte say.sh; falar
Oi!

chamá-lo de outro script bash:

#!/bin/bash
source say.sh
talk

Você também pode colocar cada um em um script separado e adicioná-los em um diretório que esteja na sua variável PATH.

por exemplo, em um script chamado hellovocê teria:

#!/bin/bash
echo "Hello World"

Agora, coloque-o em um dos diretórios do seu PATH, que você pode visualizar executando echo $PATH. Você pode adicionar outro diretório ao seu PATH se desejar ou usar um existente. Depois de copiar o arquivo, torne-o executável com chmod +x filename.

John T
fonte
3
Só para esclarecer: você só precisa originar o arquivo uma vez por inicialização de script ou shell. Você pode chamar a função quantas vezes quiser depois disso sem fazer referência ao arquivo de origem novamente.
Pausado até novo aviso.
5

Outra abordagem seria criar um script chamado functions.sh(no ~/bindiretório por exemplo).

Neste script, você adiciona todas as suas definições de funções pessoais (digamos que toda vez que você adiciona uma função, você a adiciona a este arquivo ...)

Finalmente, você apenas precisa adicionar a source ~/bin/functions.shlinha ao seu .bashrcarquivo. Dessa forma, você poderá chamá-los na linha de comando, .bashrcpermanecerá limpo e terá um local específico para suas funções pessoais.

Depurador
fonte
5

Se você é como eu, não deseja desorganizar seu ambiente com funções. Você também tem um grupo de funções que pertencem juntas em termos do que elas fazem; portanto, colocá-las no mesmo arquivo de script faz sentido. (Eu sei que uma pasta com vários arquivos pode servir ao mesmo propósito). Aqui está uma solução possível que permite chamar uma função específica no 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
fonte
Eu gosto muito mais do sourceque isso, pois ele pode lidar com duas funções com o mesmo nome em dois arquivos sh diferentes. I refinado-lo para lidar com um número arbitrário de parâmetros, substituindo $1 $2 $3 $4 $5comFUNC_CALL=$1; shift; $FUNC_CALL "$@"
Chuck Wilbur
@ChuckWilbur: Por que pular através de aros? Apenas mude a última linha para "$@". PS: Sua abordagem está realmente errada; a última parte deve estar "$FUNC_CALL" "$@"  (ou seja,  $FUNC_CALLentre aspas).
Scott
O que é "$FUNC_CALL"?
ctrl-alt-delor
0

O operador de ponto ou sourceembutido bashé análogo à importdeclaração em Java.

Você pode ler mais sobre o operador de ponto ou o sourceinterno .

onze81
fonte