bash还是路径问题?

bash还是路径问题?

系统:Mac Big Sur

我在终端上工作得更多,我认为在登录过程中定期显示不同的消息会很有趣。我知道我可以将 Fortune 命令添加到我的 .bash_profile 中,但我想将它作为系统的每个用户的 motd 运行,并使用 launchd/crontab 安排它。上次我设置一个 crontab 以 root 身份运行我的脚本,但它通过电子邮件向我发送了一条关于无法在脚本中找到命令的错误。这是我的脚本:

#!/bin/bash

#create a motd to be run by crontab every hour
fortune quotes | cowsay -f blowfish | lolcat > /etc/motd

我还没有尝试过这个,但我想我可以使用可执行文件的绝对路径,如果这是问题的话。或者我是否需要在命令周围加上反引号。我是否需要更改根 .bashrc 文件以获得文件位置的搜索路径?

答案1

问题很可能是脚本没有正确的环境变量值PATH。无论如何,这不是任何形式的语法问题。

您可以通过三种(或多种)方法之一解决此问题:

  1. 正如您自己所建议的那样,对每个命令使用绝对路径。

    唯一的例子,当你需要要执行此操作,当您要添加到的目录中有多个实用程序变体时PATH,选择实用程序的正确变体非常重要。

    例如,您可能lolcat同时拥有/usr/local/bin/opt/bin,并且您真的想要使用lolcat来自/opt/bin.同时,您想使用cowsayin/usr/local/bin而不是 in /opt/bin。在这种情况下,您不能仅将两个路径添加到PATH.

  2. 在运行管道之前,将命令所在的目录(或多个目录)添加到PATH脚本中的变量中。例如,

    #!/bin/sh
    
    PATH=$PATH:/usr/local/bin
    
    fortune quotes | cowsay -f blowfish | lolcat >/etc/motd
    

    PATH变量不需要导出,因为它已经是一个环境变量。这样做的好处是脚本不会充斥着命令的绝对路径(更易于阅读)。

  3. 您还可以PATH在从 crontab 调用脚本时修改该变量:

    0 * * * * PATH=$PATH:/usr/local/bin /path/to/my-motd-script.sh
    

    (或者无论您的日程安排是什么样子。)像这样在命令行上设置一个变量,将其设置在脚本的环境中。

    您也可以使用env具有相同效果的实用程序:

    0 * * * * env PATH="$PATH:/usr/local/bin" /path/to/my-motd-script.sh
    

    这将允许您保持当前脚本不被修改。

更改PATH根目录中的.bashrc文件根本不会产生任何影响,因为非交互式 shell 会话(例如 cron 作业)不会读取该文件。

请注意,我将该#!行更改为#!/bin/sh.我这样做是因为脚本中没有任何实际需要的内容bash。在这种情况下,这更多地与美观有关,而不是与实际功能有关。

相关内容