Quando tento executar mail
de dentro de uma função em um script bash, ele cria algo semelhante a uma fork fork. Para esclarecer, isso cria o problema:
#!/bin/bash
mail() {
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}
mail
exit 0
Às vezes você pode simplesmente matar o comando e isso mata os processos filhos, mas às vezes você precisa killall -9
.
Não importa se o email foi enviado ou não. A bomba dos garfos é criada de qualquer maneira. E não parece adicionar nenhuma verificação do código de saída, como if ! [ "$?" = 0 ]
ajuda.
Mas o script abaixo funciona conforme o esperado, ou gera um erro ou envia o email.
#!/bin/bash
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
exit 0
Por que isso acontece? E como você verificaria o código de saída do comando mail?
bash
shell-script
mail-command
roxto
fonte
fonte
Respostas:
Você está invocando a função
mail
de dentro da mesma função:Isso deve funcionar:
Observe que o nome da função não é mais chamado de dentro da própria função.
fonte
De outra forma:
... deve funcionar bem.
fonte
command
parte, como para o leigo é difícil perceber que as mudanças mudam junto comolly olly oxenfree
e'and the rest' and@more
, especialmente com o destaque da sintaxe.A solução mais "tradicional" nesses casos é realmente chamar o comando com o caminho completo:
Todas as outras respostas funcionam e provavelmente são mais portáteis, mas acho que essa é a solução mais provável que você encontraria em scripts no mundo real; portanto, incluo-a por completo.
fonte
/bin/mail
. Eu acho que isso prova o valor dacommand mail
sintaxe./usr
porque seu paradigma é mover todos os binários para o mesmo diretório, portanto,/bin
é apenas um link simbólico para/usr/bin
. Então sim ... isso não é portátil, mas é mais comum do quecommand
, de alguma forma - especialmente em scripts de inicialização herdados que foram criados especificamente para cada distribuição, todos os caminhos absolutos foram codificados (scripts rc no Slackware, por exemplo).