同じcronスクリプトを実行する複数のラズベリーパイがありますが、ラズベリーパイの1つを更新/アップグレードした後
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
質問者が問題を解決したと言ったので、あきらめたコメントをここに答えに変えました。
このコードは私に2つの問題を引き起こします。私はそれらを修正することが欠けている問題を解決するとは思わないが、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 # ^ ^ ^ ^
場合によっては、二重引用符で囲まれた変数は必ずしも必要なわけではありませんが、これは間違っていないので、常に二重引用符で囲むのが最も簡単で安全です。