関数内でメールコマンドを実行すると、「フォークボム」が発生します。

関数内でメールコマンドを実行すると、「フォークボム」が発生します。

mailBashスクリプトの関数内で実行しようとすると、フォーク爆弾のようなものが生成されます。明確にすると、次の問題が発生します。

#!/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]"
}

他のすべての答えはうまく機能し、移植性が高くなりますが、これは実際のスクリプトで見つける可能性が最も高い解決策であると考えているので、完全性のために含めます。

関連情報