我经常看到在脚本的开头导出了PATH变量。例如在/etc/init.d/rc
Debian Wheezy中的脚本中:
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
虽然我知道这可以确保脚本中使用的可执行文件从正确的目录启动,但是我还不完全了解该export
语句会影响哪些外壳程序。例如,在这里我启动(PID 3987)中名为rc
(PID 6582;命令为“ / bin / sh /etc/init.d/rc”)的脚本bash
:
init(1)-+-acpid(1926)
|-sshd(2139)-+-sshd(2375)---bash(2448)---screen(3393)---screen(3394)-+-bash(3395)---vim(3974)
| | |-bash(3397)---pstree(6584)
| | `-bash(3987)---rc(6582)---sleep(6583)
我是否正确说明rc
脚本中的此PATH导出语句仅影响PID为6582的/ bin / sh,因为父级外壳程序(在我的示例中为PID 3987的bash)不会从子级继承变量?另外,我是否纠正了脚本rc
中执行的所有命令都在带有PID 6582的/ bin / sh下启动并因此使用了此PATH=/sbin:/usr/sbin:/bin:/usr/bin
变量?如果是,那么简单的PATH = / sbin:/ usr / sbin:/ bin:/ usr / bin就足够了吗?
环境变量由脚本运行的所有进程继承。PATH
特别是会影响C函数execlp()
和的行为execvp()
,因此init.d
,启动脚本所启动的所有进程sshd
及其后代都会受到影响,但只会影响到这些后代之一更改并导出它的时刻。
特别是,bash(2448)
很可能更改它(因为它是登录外壳程序)以匹配系统和用户的配置,因此它的所有后代都受到此更改的影响。
然后,当您手动运行/etc/init.d/rc
脚本时,该更改将由该sleep
命令继承(但是该更改永远不会尝试运行)。
如果是,那么简单的PATH = / sbin:/ usr / sbin:/ bin:/ usr / bin就足够了吗?
如果您只是设置变量而不是导出变量,则取决于rc
脚本的运行方式。如果它启动任何尝试使用这些功能中的任何一个运行命令的程序,则否,只有在导出后PATH
才会影响子级。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句