在linux脚本中它意味着什么?#!/ usr/bin/python -tt

Abz*_*zac 18 python linux bash interpreter

我知道在.sh bash脚本的开头是

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

它指向命令interpeter可执行文件.

但在观看Google Python Class http://www.youtube.com/watch?v=tKTZoB2Vjuk时,我注意到他们使用python

#!/usr/bin/python -tt
Run Code Online (Sandbox Code Playgroud)

.浏览互联网我也发现了这种符号的风格:

#!/usr/local/bin/python
Run Code Online (Sandbox Code Playgroud)

乃至

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

.

所以,我是Python的新手,我是普通的Linux用户,我对这个"魔术"系列有几个疑问:

  1. 首先,这条线的正确形式是什么?为什么?
  2. -tt键在#!/ usr/bin/python -tt中意味着什么?
  3. 什么程序在Linux中解析这一行?
  4. 任何脚本的这一行的语法是什么?
  5. 如果每个文件都有它的扩展,为什么这条线是如此必要?
  6. 那些在每个计算机解释器中用于某种脚本的内容将存储在不同的地方而不是另一个地方?并且脚本无法运行.

这对我来说真的很有趣.什么是这条线?为什么这行?怎么写这一行?为什么会这样?...

Mar*_*c B 15

问题#1)这条线被称为shebang,而且没有正确的形式可以普遍使用.例如

#!python
#!/usr/bin/python
#!/usr/local/bin/python
#!/usr/bin/python -t
Run Code Online (Sandbox Code Playgroud)

都是有效/可接受的表格,但可能不适用于所有系统:

#!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
Run Code Online (Sandbox Code Playgroud)

在shell提示符下.您可以将任意命令行参数传递给shebang行上的解释器.

问题#3)

该行由OS内核和您当前使用的shell解释.之后的东西,#!只是告诉哪个程序应该被解雇了"执行"的脚本的其余部分的操作系统.

问题#4)

脚本语法取决于您使用的语言.例如,PHP shell脚本必须采用的形式

#!/usr/bin/php
<?php
  ... php code here ...
Run Code Online (Sandbox Code Playgroud)

一个#!/usr/bin/perlperl脚本必须使用Perl语法等..如果你把PHP代码与一个Perl家当,你只是有Perl BARF了语法错误的脚本,如PHP代码是不是 Perl代码

问题#5)

Shebangs用于Unix系统,其中文件扩展从未真正用于识别操作系统的文件类型.一个.c文件被理解为是一个C语言源代码文件,但是这仅仅是一个惯例.您可以将Bash shell脚本放入.c文件中,使其可执行,并使用#!/bin/bashshebang,它将作为Bash脚本执行.

通过文件扩展名确定可执行类型更像是Windows的事情.

问题#6)

这可以追溯到问题#1中的问题 - 如果shebang声称解释器处于某个其他路径而不是它的位置,那么在修复shebang或移动解释器之前,不能执行此特定脚本.Shebangs非常方便,但并非绝对正确.

值得庆幸的是,现在大多数解释器安装在相当标准的位置,所以找到(比方说)Perl安装/some/wonky/weird/path而不是/usr/bin


Abh*_*ogi 7

从联机帮助页:

-t当源文件混合使用制表符和空格进行缩进时,发出警告,使其依赖于以空格表示的制表符的价值.选项被给出两次时发出错误.

  1. 该行的正确形式是您要使用的形式.
  2. 这是解释器,读取这行称为shebang.如果你用第一行编写一个python脚本作为"#!/ usr/bin/python"并使用bash调用它,那么它就是读取第一行并启动正确解释器的/ bin/sh解释器.
  3. 这是一个shebang.特征的语法由字符序列#!组成,即数字符号和感叹号字符
  4. 文件扩展名一般与linux无关.你可以有一个没有.py扩展名的python脚本.

对于前者

shadyabhi@archlinux ~ $ cat a 
print "Hello World" 
shadyabhi@archlinux ~ $ python2 a 
Hello World 
shadyabhi@archlinux ~ $
Run Code Online (Sandbox Code Playgroud)

如果您想使用$./ script启动脚本,即使是shebang也是必需的,因为在这种情况下您没有提到要使用的解释器.