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 文件以獲得文件位置的搜尋路徑?
問題很可能是腳本沒有正確的環境變數值
PATH
。無論如何,這不是任何形式的語法問題。您可以通過以下三種(或更多)方式之一解決此問題:
- 正如您自己建議的那樣,為每個命令使用絕對路徑。
唯一需要執行此操作的情況是,當您在目錄中有多個實用程序變體時,您將添加這些
PATH
變體,並且選擇正確的實用程序變體很重要。例如,您可能
lolcat
同時擁有/usr/local/bin
and/opt/bin
,並且您確實想使用lolcat
from/opt/bin
。同時,您要使用cowsay
in/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
in root 的.bashrc
文件根本沒有任何效果,因為非互動式 shell 會話(如 cron 作業)不會讀取該文件。請注意,我將
#!
行更改為#!/bin/sh
. 我這樣做是因為腳本中沒有任何實際需要的內容bash
。在這種情況下,這更多地與美學有關,而不是與實際功能有關。