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

时间:2012-01-29 02:08:24

标签: python linux bash interpreter

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

#!/bin/bash

指向命令interpeter可执行文件。

但在观看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用户,我对这个“魔术”系列有几个疑问:

  1. 首先,这条线的正确形式是什么?为什么?
  2. -tt键在#!/ usr / bin / python -tt?
  3. 中的含义是什么
  4. 什么程序在Linux中解析这一行?
  5. 任何脚本的这一行的语法是什么?
  6. 如果每个文件都有扩展名,为什么这行必不可少?
  7. 对于某种脚本,每个计算机解释器中的内容将存储在不同的地方而不是另一个地方?并且脚本无法运行。
  8. 这对我很有意思。 什么是这条线?为什么这行?怎么写这一行?为什么会这样?...

5 个答案:

答案 0 :(得分:15)

问题#1)该行被称为shebang,并且没有正确的形式可以普遍使用。 e.g。

#!python
#!/usr/bin/python
#!/usr/local/bin/python
#!/usr/bin/python -t

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

只有当python可执行文件位于shell的PATH中时,

#!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解释。 #!之后的内容只是告诉操作系统应该启动哪个程序来“执行”脚本的其余部分。

问题#4)

脚本语法取决于您使用的语言。例如。 PHP shell脚本必须采用

的形式
#!/usr/bin/php
<?php
  ... php code here ...

#!/usr/bin/perl perl脚本必须使用Perl语法等...如果你将PHP代码与Perl shebang放在一起,那么你只需要在脚本上使用语法错误,因为PHP代码是 NOT perl代码

问题#5)

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

通过文件扩展名确定可执行文件类型更像Windows。

问题#6)

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

值得庆幸的是,现在大多数口译员都安装在相当标准的位置,所以在/some/wonky/weird/path而不是/usr/bin

上安装(例如)Perl是不寻常的。

答案 1 :(得分:6)

从联系手册:

  

-t当源文件混合制表符和空格时发出警告   缩进的方式使其依赖于制表符的价值   用空格表示。发出一个                 选项被给出两次时出错。

  1. 该行的正确形式是您要使用的形式。
  2. 这是解释器,读取此行称为shebang。如果你用第一行写一个python脚本为“#!/ usr / bin / python”&amp;使用bash调用它,它是读取第一行并启动正确解释器的/ bin / sh解释器。
  3. 这是一个shebang。特征的语法由字符序列#!组成,即数字符号和感叹号字符
  4. 文件扩展名在linux 中通常与无关。你可以有一个没有.py扩展名的python脚本。
  5. 对于前。

    shadyabhi@archlinux ~ $ cat a 
    print "Hello World" 
    shadyabhi@archlinux ~ $ python2 a 
    Hello World 
    shadyabhi@archlinux ~ $
    

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

答案 2 :(得分:1)

  1. #!/ usr / bin / env python
  2. 发布有关标签使用不一致的错误
  3. 内核
  4. #!/ path_to_the_interpreter或/ usr / bin / env
  5. * nix根本不检查extensinon(除了一些DE可以这样做)
  6. 这就是你应该使用#!/ usr / bin / env
  7. 的原因

    wiki

    的更多信息

答案 3 :(得分:0)

不同的路径是安装python解释器的位置。不同风格的Linux将它安装在不同的地方。

Linux并不关心它是Windows的扩展。

bash会话使用该行为您正在运行的脚本调用正确的解释器。

文件存储,调用和使用的不同位置都基于文件应由软件定位的定义位置。设备的开发,用户存储区域的家,程序的bin。但随着时间的推移,不同的系统需要不同的位置。

我建议你在Linux / Unix上找一本书,学习文件系统的基础知识。它确实有很大帮助。

答案 4 :(得分:-1)

这被称为shebang。它告诉系统它应该将文件作为参数传递给指定的程序,而不是试图本身执行它。

  

首先,这条线的正确形式是什么?为什么?

正确的路径是安装python解释器的地方。参数(-tt)将取决于您的需求。有些人坚持#!/usr/bin/env以防翻译恰好在其中。

  

-tt键在#!/ usr / bin / python -tt中的含义是什么?

我不使用python,所以其他人必须回答这个问题。

  

当我在Linux中启动任何脚本(不是精确的Python脚本)时,哪个程序会解析并使用此行?我认为这不是bash,因为即使对于bash脚本,也需要这一行。

我听说(而且很确定)这是内核。即使它是bash,也需要该行告诉bash它应该是一个它应该解释的脚本,而不是传递给另一个程序。 /usr/bin/env是一个命令,它在PATH中搜索指定的参数,并将脚本传递给它找到的程序。

  

任何脚本的这一行的语法是什么?什么是解析它的interpeter的名字?

语法与命令行#!command arguments相同,但command必须是绝对路径,PATH不会被搜索。

  

如果每个文件都有扩展名,为什么这条线是如此必要?

扩展在* nix中没有任何意义。我可以在没有扩展名的情况下命名一个bash脚本script.plscript.exe,甚至script。如果脚本具有正确的shebang行,则它将通过正确的解释器传递,否则内核会尝试将其作为可执行文件执行并失败。系统不知道扩展。它们只是用户的惯例,仅此而已。

  

对于某种脚本,每个计算机解释器中的内容将存储在不同的地方而不是另一个地方?并且脚本无法运行。

如果我理解正确,你会说不同的系统/发行版将口译员保持在不同的地方(例如/usr/bin/python/usr/local/bin/python),并询问系统如何知道使用哪个?
答案是,它使用的是你给它的绝对路径。这实际上是可执行脚本的一个小问题,以及/usr/bin/env开始流行的原因。正如我所说,envPATH搜索正确的解释器,因此只要您的系统有/usr/bin/env,就可以设置,您不需要查找或保证口译员的位置。