Debian

升級後我的 cron 腳本找不到命令 /usr/sbin/ssmtp

  • September 25, 2021

我有幾個執行相同的 cron 腳本的覆盆子,但是在其中一個上更新/升級 jessie 之後,我得到了

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)

我在這裡改寫一個一次性評論作為答案,因為提問者說它解決了他們的問題。

這段程式碼讓我有兩個問題。我認為修復它們不會解決 missing 的問題ssmtp,但顯然它們可以解決。

  • $( ... )從腳本的最後一行刪除包裝器。這告訴 shell 使用包裝命令的輸出,並根據您設置行的方式來嘗試執行它。(如果該命令沒有生成輸出,那麼您將不會得到任何錯誤。)
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
#                                                  ^           ^ ^       ^

在某些情況下,雙引號變數並不是絕對必要的,但是因為這樣做永遠不會出錯,所以總是引用它們是最簡單和最安全的。

引用自:https://unix.stackexchange.com/questions/670423