/ usr/bin/env如何在Linux shebang系列中运行?

use*_*968 5 linux shebang environment-variables

我知道shebang这样的:

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env python3
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,有人可以向我解释一下Linux将如何处理这个问题?

use*_*951 9

env是Unix程序的名称.如果您阅读手册(man env),您可以看到使用它的一种方法是env COMMAND,在您的情况下,COMMANDpython3.

根据手册,这将

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

env单独运行将显示NAME和VALUE的设置:

$ env
TERM=xterm-256color
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
…
Run Code Online (Sandbox Code Playgroud)

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

  • @AlSweigart 并不是每个人的可执行文件都安装在同一个地方。对于 python 来说,在使用虚拟环境时尤其如此。“env”技巧旨在提高环境之间的可移植性。对于您的确切问题,这里有一些非常好的答案:https://unix.stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-of-名称路径为我的 (4认同)

小智 8

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

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

重要的是,某些 Linux 版本会创建别名文件(也称为符号链接),例如 debian。

另请注意:bash 命令别名会覆盖此行为,因为它首先执行。