![从 crontab 运行脚本时 $USER 环境变量未定义](https://linux22.com/image/105111/%E4%BB%8E%20crontab%20%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E6%97%B6%20%24USER%20%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E6%9C%AA%E5%AE%9A%E4%B9%89.png)
我创建了一个简单的脚本来检查从 crontab 运行时环境变量的值:
#!bin/bash
echo $USER > cron.txt
我将其保存script.sh
在我的主目录中。如果我手动运行它,则cron.txt
包含我的用户名,正如我所期望的那样。
然后我在 crontab 中添加一行:
*/1 * * * * ./script.sh
我再次希望cron.txt
包含我的用户名,但现在它只是空的。
为什么$USER
从 crontab 运行脚本时没有定义?
答案1
当 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