mail
Bashスクリプトの関数内で実行しようとすると、フォーク爆弾のようなものが生成されます。明確にすると、次の問題が発生します。
#!/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]"
}
他のすべての答えはうまく機能し、移植性が高くなりますが、これは実際のスクリプトで見つける可能性が最も高い解決策であると考えているので、完全性のために含めます。