Executar o comando mail a partir de dentro de uma função causa uma “fork fork”

8

Quando tento executar mail dentro de uma função em um script bash, 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 ele matará os processos filhos, mas às vezes você terá que killall -9 .

Não importa se as mensagens foram enviadas ou não. A bomba do garfo é criada de qualquer forma. E não parece que adicionar qualquer verificação para o código de saída, como if ! [ "$?" = 0 ] , ajuda.

Mas o script abaixo funciona como previsto, 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ê faria para verificar o código de saída do comando mail?

    
por roxto 20.01.2016 / 11:14

3 respostas

29

Você está invocando a função mail na mesma função:

#!/bin/bash

mail() {
    # This actually calls the "mail" function
    # and not the "mail" executable
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}


mail

exit 0

Isso deve funcionar:

#!/bin/bash

mailfunc() {
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}

mailfunc

exit 0

Observe que o nome da função não é mais chamado pela própria função.

    
por 20.01.2016 / 11:44
15

Caso contrário:

mail(){

    echo olly olly oxenfree | command mail -s 'and the rest' and@more
}

... deve funcionar bem.

    
por 20.01.2016 / 12:08
3

A solução mais "tradicional" nesses casos é, na verdade, chamar o comando com o caminho completo:

mail() {
    echo "Free of oxens" | /usr/bin/mail -s "Do you want to play chicken with the void?" "[email protected]"
}

Todas as outras respostas funcionam e são, provavelmente, mais portáteis, mas acho que esta é a solução mais provável que você encontraria em scripts no mundo real, por isso estou incluindo-o para ser completo.

    
por 20.01.2016 / 20:49