【问题标题】:understanding PATH variable export at the beginning of the bash script理解 bash 脚本开头的 PATH 变量导出
【发布时间】:2014-08-07 11:03:25
【问题描述】:

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

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

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

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,因为父 shell(在我的示例中为 PID 为 3987 的 bash)不从子代继承变量?另外,我是否正确地在脚本rc 中执行的所有命令都在 /bin/sh 下以 PID 6582 启动,因此使用这个PATH=/sbin:/usr/sbin:/bin:/usr/bin 变量?如果是,那么简单的 PATH=/sbin:/usr/sbin:/bin:/usr/bin 还不够吗?

【问题讨论】:

    标签: bash


    【解决方案1】:

    环境变量由脚本运行的所有进程继承。 PATH 尤其会影响 C 函数 execlp()execvp() 的行为,因此由启动 sshdinit.d 脚本启动的所有进程及其后代都会受到影响,但只会影响其中之一这些后代更改并导出它。

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

    然后,当您手动运行/etc/init.d/rc 脚​​本时,更改将由sleep 命令继承(但该命令从不尝试运行任何东西)。

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

    如果您的意思只是设置变量而不是导出它,这取决于 rc 脚本运行的内容。如果它启动任何尝试运行具有这些功能的命令的任何东西,那么不会,只有在导出 PATH 之后才会影响子级。

    【讨论】:

    • 谢谢!因此,当我手动运行/etc/init.d/rc 脚本时,所有从脚本启动的命令(使用execlp()execvp() C 函数)都使用PATH=/sbin:/usr/sbin:/bin:/usr/bin?
    • 是的,但这只是因为脚本覆盖了PATH 的先前值。我没有很好地解释这一点,但是当某些代码想要运行其他命令时,这两个 C 函数是最常用的。 system(),也经常使用,使用/bin/sh,通常是bashdash 或其他可能性的符号链接。例如,bash 不直接使用exec*p(),但肯定使用PATH
    【解决方案2】:

    PATH应该在脚本运行时已经被父shell导出了,所以确实不需要。

    我可以想象运行脚本的 shell 可能未正确初始化的极端情况,例如启动脚本在启动过程的早期运行,但对于常规用户空间脚本,应该按照您想要的方式进行设置他们已经。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多