从函数内部执行邮件命令会导致“fork 炸弹”

从函数内部执行邮件命令会导致“fork 炸弹”

当我尝试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]"
}

所有其他答案都有效,并且可能更便携,但我认为这是您在现实世界中的脚本中最有可能找到的解决方案,因此我将其包含在内是为了完整性。

相关内容