我知道.sh bash脚本的开头是
#!/bin/bash
指向命令插入程序可执行文件。
但是在观看Google Python类http://www.youtube.com/watch?v=tKTZoB2Vjuk时,我注意到他们使用的是python
#!/usr/bin/python -tt
。在网上冲浪时,我也发现了这种表示法的样式:
#!/usr/local/bin/python
乃至
#!/usr/bin/env python
。
因此,我是Python的新手,我是普通的Linux用户,并且对“魔术”这一行有一些疑问:
对我来说真的很有趣。
这是什么线?为什么这条线?如何写这行?为什么这样呢?
最佳答案
问题#1)这条线称为shebang,没有正确的形式可以普遍使用。例如
#!python
#!/usr/bin/python
#!/usr/local/bin/python
#!/usr/bin/python -t
是所有有效/可接受的表格,但可能不适用于所有系统:
仅当python可执行文件位于您的Shell路径中的某个位置时,
#!python
才有效#!/usr/bin/python
仅在python二进制文件实际位于/usr/bin中时才有效#!/usr/local/bin/python
也仅在python在/usr/local/bin中时有效问题2)
#!/usr/bin/python -tt
正在将-tt
选项传递给python,就像您已经完成的一样:$ python -t somescript.py
在shell提示下。您可以在shebang行上将任意的命令行参数传递给解释器。
问题#3)
该行由OS内核和您当前使用的Shell解释。
#!
之后的内容只是告诉OS应该启动哪个程序以“执行”脚本的其余部分。问题#4)
脚本语法取决于您使用的语言。例如。 PHP Shell脚本必须采用以下形式:
#!/usr/bin/php
<?php
... php code here ...
#!/usr/bin/perl
perl脚本必须使用Perl语法,等等...如果将PHP代码与Perl shebang一起使用,您将只是用语法错误将Perl插入脚本,因为PHP代码是不是 perl代码问题#5)
Shebangs是用于Unix系统的,文件扩展名从未真正用于标识操作系统的文件类型。
.c
文件被理解为C语言源代码文件,但这仅是一个约定。您可以将Bash Shell脚本放入.c
文件中,使其可执行,然后使用#!/bin/bash
shebang,它将作为Bash脚本执行。在Windows中,通过文件扩展名确定可执行文件的类型更多。
问题#6)
这回溯了问题#1的内容-如果shebang声称解释器位于路径之外的其他路径上,则只有在shebang固定或解释器移动之后,才能执行此特定脚本。 Shebangs非常方便,但并非万无一失。
幸运的是,如今大多数解释器都安装在相当标准的位置,因此找到(说)Perl安装在
/some/wonky/weird/path
而不是/usr/bin
有点不寻常。