我有一行rc.local
在启动时运行一个简单的 bash 脚本。操作系统是 Raspberry Pi 3B+ 上的 Raspbian Stretch 4.14,配有“Witty Pi 2”电源管理板 (UUGear)。
bash /home/pi/Desktop/mount_and_run.bash &
bash 脚本似乎没有运行,并且syslog
表明该错误可能与首先没有找到该文件有关 - 没有迹象表明 bash 文件正在被读取。这是一个线索var/log/syslog
:
May 27 22:04:12 raspberrypi rc.local[417]: /home/pi/Desktop/mount_and_run.bash: line 30: cd: HOME not set
/home/pi
如果我进入终端,Raspberry 似乎确实知道 $HOME 是什么 ( ):
pwd; echo ~; echo $HOME
我还可以使用 读取桌面上的 bash 文件nano
。我以前没有见过这种情况,在以前的情况下,脚本运行良好rc.local
。我将非常感谢您的见解和建议的修复,Stretch 的安装是新鲜的,我花了几个小时进行测试和调查......
答案1
问题不在于查找脚本,问题在于您依赖于$HOME
可能未定义此变量的环境中的值(rc.local
运行环境)。 $HOME
通常只有在登录后才有值(以及在其他一些有记录的地方,例如在 cron 作业中)。
您依赖于拥有一个值,因为您在(不带参数)或波形符扩展中$HOME
隐式使用它。cd
解决此问题的一种方法是$HOME
在脚本中显式设置:
HOME=${HOME:-/home/pi}
export HOME
除非它已经设置并且非空,否则它将设置$HOME
为。/home/pi
请注意,正在运行的命令rc.local
是以 root 身份运行的。要以特定用户身份运行脚本,请使用
su username -c bash /home/pi/Desktop/mount_and_run.bash &
在rc.local
。
您甚至可能想使用su -l username -c bash ...
它来模拟完整登录,从而为$HOME
给定用户设置适当的值。
答案2
中列出的所有内容rc.local
均由 运行root
。
由于某种原因,运行时似乎HOME
未设置该变量rc.local
(这将导致/root/
,我相信您希望普通用户位于 下/home/user/
)。
要解决此问题,请$HOME
在脚本中替换为完整路径,即/home/user/
.