Debian
升級後我的 cron 腳本找不到命令 /usr/sbin/ssmtp
我有幾個執行相同的 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 # ^ ^ ^ ^
在某些情況下,雙引號變數並不是絕對必要的,但是因為這樣做永遠不會出錯,所以總是引用它們是最簡單和最安全的。