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