アップグレード後、cronスクリプトに/usr/sbin/ssmtpコマンドが見つかりません。

アップグレード後、cronスクリプトに/usr/sbin/ssmtpコマンドが見つかりません。

同じ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
    #                                                  ^           ^ ^       ^
    

    場合によっては、二重引用符で囲まれた変数は必ずしも必要なわけではありませんが、これは間違っていないので、常に二重引用符で囲むのが最も簡単で安全です。

関連情報