升级后我的 cron 脚本找不到命令 /usr/sbin/ssmtp

升级后我的 cron 脚本找不到命令 /usr/sbin/ssmtp

我有几个树莓派运行相同的 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,但显然它们可以解决。

  • $( ... )从脚本的最后一行删除包装器。这告诉 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
    #                                                  ^           ^ ^       ^
    

    在某些情况下,并非严格需要双引号变量,但由于这样做永远不会出错,因此始终引用它们是最简单且最安全的。

相关内容