Eu defini uma bash
função no meu ~/.bashrc
arquivo. Isso me permite usá-lo em terminais shell. No entanto, parece não existir quando eu o chamo de dentro de um script.
Como posso definir uma bash
função a ser usada pelos scripts também?
bash
shell-script
function
Onturenio
fonte
fonte
/bin/sh
na linha shebang?Respostas:
~/.bash_profile
e~/.bashrc
não são lidos por scripts, e as funções não são exportadas por padrão. Para fazer isso, você pode usarexport -f
o seguinte:export -f foo
também pode ser chamado~/.bash_profile
para disponibilizar essa função para scripts após o login. Esteja avisado de queexport -f
não é portátil.Uma solução melhor seria obter o arquivo que contém a função usando
. file
. Isso é muito mais portátil e não depende de seu ambiente ser configurado de uma maneira específica.fonte
function myFunction { ... }
em~/.bash_profile
e você está pronto?export
solução parece funcionar corretamente. Obrigado.foo
função defile
2) Você pode controlar melhor o conteúdo do quefile
garantir que o shell de chamada não mudoufoo
antes de chamar seu script. Você pode adicionar verificações de segurançafile
para garantir que ela não seja alterada, por exemplo. (não é fácil, mas é possível). (bem, você também pode fazer essas verificações na função foo definida ... mas você entende meu desvio ^^ Acho que o método 2 é mais limpo.) 3)file
conterá apenas o necessário, e não mais..bashrc
é lido apenas por conchas interativas. (Na verdade, isso é uma simplificação excessiva: o bash é peculiar a esse respeito. O Bash não lê.bashrc
se é um shell de logon, interativo ou não. E há uma exceção até a exceção: se o processo pai do bash forrshd
orsshd
, então o bash lê.bashrc
, seja interativo ou não.)Coloque suas definições de função em um arquivo em um local conhecido e use o
.
(também escritosource
) para incluir esse arquivo em um script.Se desejar, você pode seguir o recurso de carregamento automático do ksh. Coloque cada definição de função em um arquivo com o mesmo nome que a função. Liste os diretórios que contêm as definições de função na
FPATH
variável (uma lista de diretórios separados por dois pontos). Aqui está uma aproximação grosseira do ksh,autoload
que realmente carrega a função imediatamente, em vez de sob demanda:fonte
Você precisa de uma função? Caso contrário, considere extrair a lógica em um script Bash independente e separado no seu
$PATH
. Por exemplo, eu tive isso no meu~/.bashrc
:~/bin
está no meu$PATH
, então eu criei~/bin/wanip
com o seguinte conteúdo:E correu
chmod 0755 ~/bin/wanip
para torná-lo executável. Agora eu posso executar awanip
partir de outros scripts.Eu gosto de ter
wanip
um script Bash independente. Isso me lembra que eu quero essa lógica geralmente disponível (além apenas da minha atual sessão interativa do Bash). O script encapsula bem a lógica e a documentação para o mesmo.fonte