【发布时间】:2017-10-03 05:35:12
【问题描述】:
我知道shebang线是这样的:
#!/bin/sh
但我发现我也可以像这样使用 shebang 行:
#!/usr/bin/env python3
这让我很困惑,有人可以向我解释一下 Linux 将如何处理这个吗?
【问题讨论】:
标签: linux environment-variables shebang
我知道shebang线是这样的:
#!/bin/sh
但我发现我也可以像这样使用 shebang 行:
#!/usr/bin/env python3
这让我很困惑,有人可以向我解释一下 Linux 将如何处理这个吗?
【问题讨论】:
标签: linux environment-variables shebang
env 是 Unix 程序的名称。如果您阅读手册 (man env),您会发现其中一种使用方式是 env COMMAND,在您的情况下,COMMAND 是 python3。
根据手册,这样会
在环境中将每个 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 本地的?
env 中的名称/值对起源于 shell;所以是的,它们坚持在外壳中。
#!/bin/sh
只是解释器二进制文件的路径,而
#!/usr/bin/env python3
具有将python3 作为可选参数传递给#!/usr/bin/env 解释器的解释器路径
更多信息请参考wiki。
【讨论】:
基本一样
tail -n +1 yourfile | /usr/bin/env python
【讨论】:
较新的 *nix 版本会以与命令 which 相同的方式解决此问题。
它会逐个查找在环境变量 $PATH 中设置的所有目录,无论它是在哪里设置(全局、在您的 .bashrc 或其他登录脚本中或手动设置),并返回第一个匹配项。
重要的是,一些 linux 版本会创建别名文件(又名符号链接),例如Debian。
另一个注意事项:bash 命令别名在首先执行时会覆盖此行为。
【讨论】: