【问题标题】:How does /usr/bin/env work in a Linux shebang line?/usr/bin/env 如何在 Linux shebang 行中工作?
【发布时间】:2017-10-03 05:35:12
【问题描述】:

我知道shebang线是这样的:

#!/bin/sh

但我发现我也可以像这样使用 shebang 行:

#!/usr/bin/env python3

这让我很困惑,有人可以向我解释一下 Linux 将如何处理这个吗?

【问题讨论】:

标签: linux environment-variables shebang


【解决方案1】:

env 是 Unix 程序的名称。如果您阅读手册 (man env),您会发现其中一种使用方式是 env COMMAND,在您的情况下,COMMANDpython3

根据手册,这样会

在环境中将每个 NAME 设置为 VALUE 并运行 COMMAND。

单独运行 env 会告诉您设置了哪些名称和值:

$ env
TERM=xterm-256color
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
…

因此,/usr/bin/env python3 是一条指令,用于设置 PATH(以及所有其他 NAME+VALUE 对),然后使用 PATH 中包含 @ 的第一个目录运行 python3 987654332@ 可执行文件。

【讨论】:

  • python 退出后,变量是否保留在本地 shell 中?还是它们只是 python 本地的?
  • @Pacerier env 中的名称/值对起源于 shell;所以是的,它们坚持在外壳中。
【解决方案2】:
#!/bin/sh

只是解释器二进制文件的路径,而

#!/usr/bin/env python3

具有将python3 作为可选参数传递给#!/usr/bin/env 解释器的解释器路径

更多信息请参考wiki

【讨论】:

    【解决方案3】:

    基本一样

    tail -n +1 yourfile | /usr/bin/env python
    

    【讨论】:

      【解决方案4】:

      较新的 *nix 版本会以与命令 which 相同的方式解决此问题。

      它会逐个查找在环境变量 $PATH 中设置的所有目录,无论它是在哪里设置(全局、在您的 .bashrc 或其他登录脚本中或手动设置),并返回第一个匹配项。

      重要的是,一些 linux 版本会创建别名文件(又名符号链接),例如Debian。

      另一个注意事项:bash 命令别名在首先执行时会覆盖此行为。

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 2019-01-20
        • 2011-12-01
        相关资源
        最近更新 更多