동일한 cron 스크립트를 실행하는 여러 라즈베리 파이가 있지만 라즈베리 파이 중 하나를 업데이트/업그레이드한 후
ssmtp:: command not found
명령줄에서 명령을 실행할 수 있지만 명령줄에서 스크립트를 실행하면 실패하므로 실제로 cron 문제는 아닙니다.
전체 경로를 사용하고 있습니다./usr/sbin/ssmtp
명령줄에서 이 명령을 사용하면 정상적으로 실행됩니다.
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
이것은 스크립트 코드의 일부입니다.
#!/bin/bash
set -o pipefail
mysendmail="/usr/sbin/ssmtp"
…
$(echo -e "To: $tophil\nSubject: $(hostname) $ip2" | $mysendmail $tophil 2>&1)
답변1
질문자가 문제를 해결했다고 말했기 때문에 포기한 의견을 여기에 답변으로 바꾸었습니다.
이 코드는 나에게 두 가지 문제를 야기합니다. 나는 그것들을 고치는 것이 누락된 문제를 해결할 것이라고 생각하지 않지만 ssmtp
분명히 그렇습니다.
$( ... )
스크립트의 마지막 줄에서 래퍼를 제거합니다. 이는 셸이 래핑된 명령의 출력을 사용하도록 지시하고, 줄 설정 방법에 따라 이를 실행하려고 시도합니다. (명령이 출력을 생성하지 않으면 오류가 발생하지 않습니다.)echo hello hello $(echo hello) -bash: hello: command not found
명령 결과를 문자열에 삽입하거나 변수에 할당하는 데 자주 사용됩니다.
a=$(date) printf "Today's date is: %s\n" "$(date +%Y-%m-%d)"
변수를 사용할 때마다 큰따옴표로 묶으십시오. 예를 들어,
echo -e "To: $tophil\nSubject: $(hostname) $ip2" | "$mysendmail" "$tophil" 2>&1 # ^ ^ ^ ^
어떤 경우에는 큰따옴표로 묶인 변수가 꼭 필요한 것은 아니지만 이렇게 하면 잘못될 일이 없으므로 항상 큰따옴표로 묶는 것이 가장 쉽고 안전합니다.