L'esecuzione del comando di posta all'interno di una funzione provoca un "fork bomb"


8

Quando provo ad eseguire maildall'interno una funzione in uno script bash, crea qualcosa di simile a una bomba a forcella. Per chiarire, questo crea il problema:

#!/bin/bash

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

mail

exit 0

A volte puoi semplicemente uccidere il comando e questo ucciderà i processi figlio, ma a volte dovrai farlo killall -9.

Non importa se la posta è stata inviata o meno. La bomba a forcella viene creata in entrambi i modi. E non sembra aggiungere alcun controllo per il codice di uscita, ad esempio if ! [ "$?" = 0 ], aiuta.

Ma lo script seguente funziona come previsto, o genera un errore o invia la posta.

#!/bin/bash

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

exit 0

Perché succede? E come faresti per controllare il codice di uscita del comando mail?


10
Si chiama ricorsione.
Jakuje,

Risposte:


29

Stai invocando la funzione mail all'interno della stessa funzione:

#!/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

Questo dovrebbe funzionare:

#!/bin/bash

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

mailfunc

exit 0

Si noti che il nome della funzione non viene più richiamato dall'interno della funzione stessa.


3
Succede al meglio di noi, amico.
Almo,

15

Altrimenti:

mail(){

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

... dovrebbe funzionare bene.


7
Forse enfatizzando la commandparte, come per i non addetti ai lavori è difficile notare che il cambiamento insieme a olly olly oxenfreee 'and the rest' and@morecambia, specialmente con l'evidenziazione della sintassi.
wizzwizz4,

1
@ wizzwizz4 - Sostengo questo commento.
Mikeserv,

1
Si è divertente anche se ...
wizzwizz4

3

La soluzione più "tradizionale" in questi casi è in realtà chiamare il comando con il percorso completo:

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

Tutte le altre risposte funzionano e sono probabilmente più portabili, ma penso che questa sia la soluzione più probabile che potresti trovare negli script nel selvaggio mondo reale, quindi la includo per completezza.


3
In effetti non sono abituato alla posta che si trova in / usr / bin.
Joshua,

3
@Joshua, sembra essere lì su OS X. In CentOS 6 lo è /bin/mail. Penso che questo dimostri il valore della command mailsintassi.
Wildcard

Arch Linux ha anche questo /usrperché il loro paradigma è quello di spostare tutti i binari nella stessa directory, quindi /binè solo un link simbolico a /usr/bin. Quindi sì ... questo non è portatile, ma è più comunemente visto che command, in qualche modo - specialmente negli script di avvio legacy creati appositamente per ogni distribuzione, tutti i percorsi assoluti erano codificati (ad esempio script rc in Slackware).
Orione,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.