L'exécution de la command de courrier à partir d'une fonction provoque une "fourchette"

Lorsque j'essaie d'exécuter du mail partir d'une fonction dans un script bash, cela crée quelque chose de similaire à une bombe à fourche. Pour clarifier, cela crée le problème:

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

Parfois, vous pouvez simplement tuer la command et cela va tuer les process enfants, mais parfois vous devrez tuer tous les killall -9 .

Il ne se soucie pas si le courrier a été envoyé ou non. La bombe à fourche est créée de toute façon. Et il ne semble pas append de contrôle pour le code de sortie, comme if ! [ "$?" = 0 ] if ! [ "$?" = 0 ] if ! [ "$?" = 0 ] , aide.

Mais le script ci-dessous fonctionne comme prévu, soit il génère une erreur, soit il envoie le courrier.

 #!/bin/bash echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]" exit 0 

Pourquoi cela arrive-t-il? Et comment allez-vous vérifier le code de sortie de la command mail?

Vous appelez la fonction mail partir de la même fonction:

 #!/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 

Cela devrait fonctionner:

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

Notez que le nom de la fonction n'est plus appelé à partir de la fonction elle-même.

Autrement:

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

… devrait fonctionner correctement.

La solution la plus «traditionnelle» dans ces cas est en fait d'appeler la command avec le path complet:

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

Toutes les autres réponses fonctionnent, et sont probablement plus portables, mais je pense que c'est la solution la plus probable que vous findez dans les scripts dans le monde réel sauvage, donc je l'inclus pour l'exhaustivité.