我看到很多文件的第一行都是这一行。这到底是什么?
#!/usr/bin/env python
这是什么意思?为什么有必要?
答案1
这不仅仅是/usr/bin/env python
而且#!/usr/bin/env python
这条线被称为舍邦。
我引用维基百科:
在类 Unix 操作系统下,当带有 shebang 的脚本作为程序运行时,程序加载器会将脚本初始行的其余部分解析为解释器指令;而是运行指定的解释器程序,并将最初尝试运行脚本时使用的路径作为参数传递给它。[8] 例如,如果脚本以路径“path/to/script”命名,并且它以以下行开头:
#!/bin/sh
然后指示程序加载器运行程序“/bin/sh”(通常是 Bourne shell 或兼容 shell),并将“path/to/script”作为第一个参数传递。
解释器通常会忽略 shebang 行,因为“#”字符在许多脚本语言中都是注释标记;一些不使用井号开始注释的语言解释器(例如 Scheme)仍可能会忽略 shebang 行以识别其用途。
就我的情况(13.10 桌面版)而言,/usr/bin/env python
默认为 python2.7,但根据系统默认值(例如 14.04 服务器),也可能是 python3.4。
$ /usr/bin/env python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
答案2
类似这样的一行可以出现在解释程序或脚本的第一行。它是指示程序加载器将文件传递给解释器(在本例中为 Python)。
解释器指令位于可执行脚本的第一行,位于字符#!
(称为舍邦或者哈希邦),这样就可以仅通过脚本名称来执行脚本,在命令行中使用以下方式之一:
$ script
$ ./script
$ path/to/script
为了能够像命令一样以这种方式执行脚本,它必须具有执行权限。
而不是使用脚本名称作为参数的解释器,如果没有解释器指令,则需要这样做:
$ python path/to/script
答案3
#!
被称为 shebang。通常,Bash 会将该符号#
视为注释,但是看到后,#!
Bash 知道其余内容应该是脚本,并且第一行将引用要调用的程序或解释器。在这种情况下,#!/usr/bin/env python
Bash 知道此行正在调用 Python 解释器的正确“环境设置”。因此,文件的其余内容将使用 Python 解释器运行。如果该行是这样的#!/bin/bash
或#!/usr/bin/perl
Bash 将分别使用 Bash(本身)或 Perl 运行内容。
您仍然可以编写 Python、Bash 或 Perl 脚本而不提及此行。在这种情况下,要运行 Python 脚本,您需要通过以下方式从命令行调用:
/usr/bin/python MyScript.py
这是因为如果没有 shebang#!
并且没有正确的解释器路径,Bash 就不会知道它是一个脚本并将其视为文本文件。