Tenho um script que tem algumas funções.
Posso executar uma das funções diretamente da linha de comando?
Algo assim?
myScript.sh func()
Se o script apenas definir as funções e não fizer mais nada, você pode primeiro executar o script dentro do contexto do shell atual usando o comando source
ou .
e, em seguida, simplesmente chamar a função. Veja help source
para mais informações.
exit
em sua função, ele fechará o terminal após a execução da função. Existe alguma maneira de contornar isso? @SvenMarnachbash
) eexit
só encerrará o subshell, mas não seu terminal.Bem, enquanto as outras respostas estão certas - você certamente pode fazer outra coisa: se você tiver acesso ao script bash, você pode modificá-lo e simplesmente colocar no final o parâmetro especial
"$@"
- que se expandirá para os argumentos da linha de comando você especifica e, como está "sozinho", o shell tentará chamá-los literalmente; e aqui você pode especificar o nome da função como o primeiro argumento. Exemplo:Para polir, você pode primeiro verificar se o comando existe e é uma função:
fonte
"$@"
na maioria dos casos.$@
não é seguro em alguns casos.bash test.sh testA testB
?[ ! -z "$1" ]
caso contrário, a fonte levantará a instrução else em algumasO comando a seguir primeiro registra a função no contexto e a chama:
fonte
Resumidamente, não.
Você pode importar todas as funções do script para o seu ambiente com
source
(help source
para obter detalhes), o que permitirá que você as chame. Isso também tem o efeito de executar o script, portanto, tome cuidado.Não há como chamar uma função de um script de shell como se fosse uma biblioteca compartilhada.
fonte
Usando
case
Este script executará as funções fun1 e fun2, mas se você iniciá-lo com a opção fun1 ou fun2, ele apenas executará a função dada com args (se fornecida) e sairá. Uso
fonte
Editar: AVISO - parece que isso não funciona em todos os casos, mas funciona bem em muitos scripts públicos.
Se você tem um script bash chamado "control" e dentro dele você tem uma função chamada "build":
Então você pode chamá-lo assim (do diretório onde está):
Se estiver dentro de outra pasta, isso o tornaria:
Se o seu arquivo for chamado "control.sh", isso tornaria a função chamável assim:
fonte
. ./control.sh && build
Tenho uma situação em que preciso de uma função do script bash que não deve ser executada antes (por exemplo, por
source
) e o problema@$
é que myScript.sh é executado duas vezes, parece ... Então, tive a ideia para obter a função com sed:sed -n "/^func ()/,/^}/p" myScript.sh
E para executá-lo na hora que preciso, coloco em um arquivo e uso
source
:sed -n "/^func ()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh
fonte
você pode chamar a função a partir do argumento da linha de comando como abaixo
assim que a função end coloque $ 1 para aceitar o argumento, digamos que o código acima seja salvo em fun.sh para executar a função ./fun.sh irfan & ./fun.sh config
fonte
Postagem resolvida, mas gostaria de mencionar minha solução preferida. Ou seja, defina um script genérico de uma linha
eval_func.sh
:Em seguida, chame qualquer função em qualquer script por meio de:
Um problema que encontrei com a solução aceita é que, ao buscar meu script que contém a função em outro script, os argumentos do último seriam avaliados pelo primeiro, causando um erro.
fonte