为什么rc.local需要绝对path? 我怎样才能在启动时运行脚本不使用它们?

我有一个在CentOS中从rc.local启动的脚本。 这个脚本包含一个命令来使用称为rebar的第三方构build命令来编译我的erlang项目。 钢筋行在启动时没有编译我的项目,但是如果我手动运行它,项目编译就可以了。 我认为这是因为rebar命令调用没有绝对path的其他命令。

如何在启动时运行命令,但是在不需要绝对path的环境中运行?

我不想修补这个第三方命令(并处理出现混乱的不可避免的官僚作风)和/或保留我自己的项目并行分支来维持这个额外的function。

我也很好奇为什么我不能谷歌这一点。 似乎必须经常出现,所以人们希望在rc.local中使用本身不使用全部绝对path命令调用的命令。 而且,我觉得答案应该是微不足道的,因为我可以在启动后马上login并运行任何我喜欢的命令,作为root用户,rc.local也是运行的用户! 是不是有一个钩子,你可以在“是的,我们现在真的启动了,我们运行这个脚本作为一个完全同行的用户在系统上没有任何限制”的上下文中运行一个脚本?

这不是我第一次遇到这个问题,我很想知道发生了什么事情。

编辑:

(我不会等待8个小时来回答我自己的问题,所以…)

那么,它看起来像设置PATH的作品。 我觉得我已经有了一个印象,即在调用bash脚本之后,在rc.local及其子目录下的命令不会在PATH中search,但这是错误的。 (@TiZon给了我一个很好的线索)。我得到这个印象的原因是因为每个Google的结果都告诉提问者在命令调用中使用绝对path,即使除了依赖于第三方命令的简单脚本或脚本之外的任何东西那不遵循这个规则。 相反,答案是用合适的shebang行来调用bash脚本,在常规会话期间通过回显它来找出正常环境的PATH,然后将启动bash脚本中的PATH设置为常规环境的PATH。

希望这个答案能够在Google中浮出水面,帮助其他一些可怜的人失去灵魂。

尝试将/bin/bash放在命令前面。 你不能使用相对path,因为没有环境来跟踪它们。 如果你在bash-shell中运行所有的东西,bash会为你保留这些东西。 crontab

请记住,rc.local在path/中运行,而不是从它所在的path运行。
因此,如果您从rc.local调用脚本,如
/home/myscript
如果该脚本本身包含相对path(即,它已经被假定为从/ home运行),则从/运行时将会失败。
你想从rc.local运行的任何脚本都应该通过从/运行它来testing:
cd /
./home/myscript
如果运行正常,那么你可以确定绝对/相对path没有问题