Lorsque j'essaie d'exécuter mail
de l'intérieur d'une fonction dans un script bash, cela crée quelque chose de similaire à une bombe fork. 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 commande et cela tuera les processus enfants, mais parfois vous devrez le faire killall -9
.
Peu importe que le courrier ait été envoyé ou non. La bombe à fourche est créée de toute façon. Et il ne semble pas que l'ajout d'une vérification du code de sortie, tel que 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 procéder pour vérifier le code de sortie de la commande mail?
Réponses:
Vous appelez la fonction à
mail
partir de la même fonction:Cela devrait fonctionner:
Notez que le nom de la fonction n'est plus appelé depuis la fonction elle-même.
la source
Autrement:
... devrait bien fonctionner.
la source
command
partie, comme pour le profane, il est difficile de remarquer que le changement avec leolly olly oxenfree
et'and the rest' and@more
change, en particulier avec la coloration syntaxique.La solution la plus "traditionnelle" dans ces cas est en fait d'appeler la commande avec le chemin complet:
Toutes les autres réponses fonctionnent et sont probablement plus portables, mais je pense que c'est la solution la plus probable que vous trouveriez dans les scripts dans le monde réel sauvage, donc je l'inclus pour être complet.
la source
/bin/mail
. Je pense que cela prouve la valeur de lacommand mail
syntaxe./usr
parce que leur paradigme est de déplacer tous les binaires dans le même répertoire, donc/bin
c'est juste un lien symbolique vers/usr/bin
. Alors oui ... ce n'est pas portable, mais c'est plus courant quecommand
, d'une manière ou d'une autre - en particulier dans les scripts de démarrage hérités qui ont été créés spécifiquement pour chaque distribution, tous les chemins absolus étaient codés en dur (scripts rc dans Slackware, par exemple).