我知道 .sh bash 脚本的开头是
#!/bin/bash
它指向命令解释器可执行文件。
但是在观看 Google Python Class http://www.youtube.com/watch?v=tKTZoB2Vjuk 期间我注意到他们使用 python
#!/usr/bin/python -tt
。在网上冲浪我也发现了这种表示法的风格:
#!/usr/local/bin/python
甚至
#!/usr/bin/env python
.
所以,我是 Python 新手,我是普通 Linux 用户,我对这个“神奇”行有几个问题:
- 首先,这条线的正确形式是什么?为什么?
- #!/usr/bin/python -tt 中的 -tt 键是什么意思?
- 什么程序在 Linux 中解析这一行?
- 对于任何脚本,该行的语法是什么?
- 如果每个文件都有扩展名,为什么这一行如此必要?
- 那么,在每个计算机解释器中,某种脚本将存储在不同的地方而不是另一个地方呢?并且脚本无法运行。
这对我来说真的很有趣。 这是什么线?为什么是这条线?这行怎么写?为什么会这样?...
最佳答案
问题 #1) 这条线被称为 shebang,并没有适用于通用的正确形式。例如
#!python
#!/usr/bin/python
#!/usr/local/bin/python
#!/usr/bin/python -t
都是有效/可接受的形式,但可能不适用于所有系统:
#!python
仅当 python 可执行文件位于 shell 的 PATH 中的某个位置时才有效
#!/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)
该行由操作系统内核和您当前使用的 shell 解释。 #!
之后的内容只是告诉操作系统应该启动哪个程序来“执行”脚本的其余部分。
问题 #4)
脚本语法取决于您使用的语言。例如。 PHP shell 脚本的格式必须为
#!/usr/bin/php
<?php
... php code here ...
#!/usr/bin/perl
perl 脚本必须使用 Perl 语法等...有语法错误,因为 PHP 代码是 不是 perl 代码
问题 #5)
Shebangs 用于 Unix 系统,其中文件扩展名从未真正用于向操作系统识别文件类型。 .c
文件被理解为 C 语言源代码文件,但这只是一种约定。您可以将 Bash shell 脚本放入 .c
文件中,使其可执行,然后使用 #!/bin/bash
shebang,它将作为 Bash 脚本执行。
通过文件扩展名确定可执行类型更像是 Windows 的事情。
问题 #6)
这可以追溯到问题 #1 - 如果 shebang 声称解释器位于其他路径而不是它所在的位置,则在修复 shebang 或移动解释器之前无法执行此特定脚本。 Shebangs 非常方便,但并非万无一失。
谢天谢地,现在大多数解释器都安装在相当标准的位置,因此在 /some/wonky/weird/path
而不是 找到(比如说)安装 Perl 有点不寻常>/usr/bin
关于python - 在 linux 脚本中是什么意思? #!/usr/bin/python -tt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050331/