함수 내부에서 메일 명령을 실행하면 "포크 폭탄"이 발생합니다.

함수 내부에서 메일 명령을 실행하면 "포크 폭탄"이 발생합니다.

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]"
}

다른 모든 답변은 작동하고 이식성이 더 높지만 이것이 실제 스크립트에서 찾을 가능성이 가장 높은 솔루션이라고 생각하므로 완전성을 위해 포함합니다.

관련 정보