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


8

mailbashスクリプトの関数内から実行しようとすると、フォーク爆弾のようなものが作成されます。明確にするために、これは問題を作成します:

#!/bin/bash

mail() {
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"
}

mail

exit 0

場合によっては、コマンドを強制終了するだけで子プロセスを強制終了することもありますが、強制する必要がある場合もありますkillall -9

メールが送信されたかどうかは関係ありません。フォーク爆弾は、いずれかの方法で作成されます。そして、のような終了コードのチェックを追加することは役に立たないようですif ! [ "$?" = 0 ]

ただし、以下のスクリプトは意図したとおりに機能し、エラーを出力するか、メールを送信します。

#!/bin/bash

echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"

exit 0

なぜこれが起こるのですか?そして、mailコマンドの終了コードをどのようにチェックしますか?


10
これは再帰と呼ばれます。
Jakuje

回答:


29

同じ関数内から関数 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?" "example@example.org"
}


mail

exit 0

これはうまくいくはずです:

#!/bin/bash

mailfunc() {
    echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "example@example.org"
}

mailfunc

exit 0

関数名が関数自体から呼び出されなくなったことに注意してください。


3
私たちの最高の人に起こります。
Almo 2016年

15

さもないと:

mail(){

    echo olly olly oxenfree | command mail -s 'and the rest' and@more
}

...うまくいくはずです。


7
おそらくcommand一部を強調します。一般の人にとっては、特に構文の強調表示で、olly olly oxenfreeとの変更に伴う変更に気づくことは困難'and the rest' and@moreです。
wizzwizz4

1
@ wizzwizz4-私はこのコメントをサポートしています。
mikeserv 2016年

1
それはある ...けれども面白い
wizzwizz4

3

これらの場合の最も「従来の」解決策は、実際にはフルパスでコマンドを呼び出すことです。

mail() {
    echo "Free of oxens" | /usr/bin/mail -s "Do you want to play chicken with the void?" "example@example.org"
}

他のすべての答えは機能し、おそらくより移植性がありますが、これは野生の現実世界のスクリプトで見つかる最も可能性の高い解決策だと思うので、完全を期すために含めます。


3
実際、私は/ usr / binにあるメールに慣れていません。
Joshua

3
@ジョシュア、それはOS X上にあるようです。CentOS6ではそれがあり/bin/mailます。これはcommand mail構文の価値を証明していると思います。
ワイルドカード2016年

/usrそれらのパラダイムはすべてのバイナリを同じディレクトリに移動することなので、Arch Linuxにもこれ/binがあり、へのシンボリックリンク/usr/binです。だからはい...これは移植可能ではありませんがcommand、どういうわけか、より一般的に見られます-特に各ディストリビューション専用に作成されたレガシーブートスクリプトでは、すべての絶対パスがハードコーディングされていました(たとえば、Slackwareのrcスクリプト)。
オリオン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.