Cron
從 crontab 執行腳本時 $USER 環境變數未定義
我創建了一個簡單的腳本來檢查從 crontab 執行時環境變數的值:
#!bin/bash echo $USER > cron.txt
我把它保存
script.sh
在我的主目錄中。如果我手動執行它,cron.txt
包含我的使用者名,正如我所期望的那樣。然後我在我的 crontab 中添加一行:
*/1 * * * * ./script.sh
我再次希望
cron.txt
包含我的使用者名,但現在它只是空的。為什麼
$USER
從 crontab 執行腳本時沒有定義?
當 cron 執行您的作業時,它會在與您目前的 shell 環境不同的環境中執行此操作。
例如,這意味著
./script.sh
可能找不到。有兩種解決方案:
*/1 * * * * ( cd $HOME/mydir && ./script.sh )
或者
*/1 * * * * $HOME/mydir/script.sh
即,準確指定可以找到腳本的位置。
如果您不對腳本中的輸出文件使用絕對路徑名,則第一種選擇可能更可取。
如果您使用第二個選項,請修改您的腳本,以便您知道輸出文件的位置:
#!/bin/bash echo "$USER" >"$HOME/mydir/cron.txt"
或者
#!/bin/bash ( cd "$HOME/mydir" && echo "$USER" >cron.txt )
請注意,該
#!
行必須包含正確的絕對路徑bash
(您的路徑是相對路徑)。還應注意,某些 Unices (Linux) 上的 cron 未設置
USER
為執行 cron 作業的使用者的使用者名。在這些系統上,在呼叫腳本時使用$LOGNAME
或設置USER
為:$LOGNAME
*/1 * * * * env USER=$LOGNAME $HOME/mydir/script.sh