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

时间:2017-05-04 21:27:49

标签: linux environment-variables shebang

我知道shebang这样的行:

Error:(168, 1) error: class, interface, or enum expected
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

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

#!/bin/sh

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

4 个答案:

答案 0 :(得分:7)

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
…

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

基本上像

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

答案 3 :(得分:0)

#!/bin/sh

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

#!/usr/bin/env python3

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

请参阅wiki了解详情。