了解bash脚本开头的路径变量导出

了解bash脚本开头的路径变量导出,bash,Bash,我经常看到PATH变量是在脚本开始时导出的。例如,Debian Wheezy中的/etc/init.d/rc脚本: PATH=/sbin:/usr/sbin:/bin:/usr/bin export PATH 虽然我知道这可以确保脚本中使用的可执行文件是从正确的目录启动的,但我不完全理解哪些shell受此export语句的影响。例如,这里我在bash(PID 3987)中启动名为rc(PID 6582;命令为“/bin/sh/etc/init.d/rc”)的脚本: rc脚本中的这个PATH e

我经常看到PATH变量是在脚本开始时导出的。例如,Debian Wheezy中的
/etc/init.d/rc
脚本:

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
虽然我知道这可以确保脚本中使用的可执行文件是从正确的目录启动的,但我不完全理解哪些shell受此
export
语句的影响。例如,这里我在
bash
(PID 3987)中启动名为
rc
(PID 6582;命令为“/bin/sh/etc/init.d/rc”)的脚本:


rc
脚本中的这个PATH export语句只影响PID为6582的/bin/sh,因为父shell(在我的示例中是PID为3987的bash)不从子shell继承变量,这对吗?此外,在脚本
rc
中执行的所有命令都是在/bin/sh下以PID 6582启动的,因此使用了这个
PATH=/sbin:/usr/sbin:/bin:/usr/bin
变量,对吗?如果是,那么简单路径=/sbin:/usr/sbin:/bin:/usr/bin还不够吗?

环境变量由从脚本运行的所有进程继承<代码>路径尤其会影响C函数
execlp()
execvp()
的行为,因此启动
sshd
init.d
脚本启动的所有进程及其子体都会受到影响,但直到这些子体中的一个发生更改并将其导出为止

特别是,
bash(2448)
很可能会更改它,因为它是一个登录shell,以匹配系统和用户的配置,因此所有它的后代都会受到此更改的影响

然后,当手动运行
/etc/init.d/rc
脚本时,更改由
sleep
命令继承(但该命令从不尝试运行anithing)

如果是,那么简单的路径=/sbin:/usr/sbin:/bin:/usr/bin还不够吗


如果您的意思是只设置变量而不是导出变量,那么这取决于
rc
脚本运行的内容。如果它启动任何试图使用这些函数运行命令的命令,则不会,只有在导出
PATH
后,它才会影响子脚本。

PATH
应该在脚本运行时由父shell导出,因此确实不需要


我可以想象在某些情况下,运行脚本的shell可能没有正确初始化,例如启动过程中很早就运行的启动脚本,但对于常规用户空间脚本,应该按照您希望的方式进行设置。

谢谢!因此,当我手动运行
/etc/init.d/rc
脚本时,所有命令都从脚本开始,使用
execlp()
execvp()
C函数,使用
PATH=/sbin:/usr/sbin:/usr/bin
?是的,但这只是因为脚本覆盖了
PATH
的先前值。我没有很好地解释这一点,但是当一些代码想要运行其他命令时,这两个C函数是最常用的
system()
也被广泛使用,它使用
/bin/sh
,通常是指向
bash
dash
或其他可能性的符号链接<例如,code>bash不直接使用
exec*p()
,但肯定使用
PATH
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)