当我尝试mail
从 bash 脚本中的函数内部执行时,它会创建类似于 fork 炸弹的东西。澄清一下,这会产生问题:
#!/bin/bash
mail() {
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}
mail
exit 0
有时您只需终止该命令,它就会终止子进程,但有时您必须这样做killall -9
。
它并不关心邮件是否已发送。这叉子炸弹无论哪种方式都可以创建。并且添加任何退出代码检查(例如 , )似乎没有if ! [ "$?" = 0 ]
帮助。
但下面的脚本按预期工作,要么输出错误,要么发送邮件。
#!/bin/bash
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
exit 0
为什么会出现这种情况?您将如何检查 mail 命令的退出代码?
答案1
你正在调用功能 mail
从同一函数内:
#!/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
这应该有效:
#!/bin/bash
mailfunc() {
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}
mailfunc
exit 0
请注意,函数名称不再从函数本身内部调用。
答案2
否则:
mail(){
echo olly olly oxenfree | command mail -s 'and the rest' and@more
}
...应该可以正常工作。
答案3
在这些情况下,最“传统”的解决方案实际上是使用完整路径调用命令:
mail() {
echo "Free of oxens" | /usr/bin/mail -s "Do you want to play chicken with the void?" "[email protected]"
}
所有其他答案都有效,并且可能更便携,但我认为这是您在现实世界中的脚本中最有可能找到的解决方案,因此我将其包含在内是为了完整性。