我知道.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用户,我对这个“魔术”系列有几个疑问:
这对我很有意思。 什么是这条线?为什么这行?怎么写这一行?为什么会这样?...
答案 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
答案 1 :(得分:6)
从联系手册:
-t当源文件混合制表符和空格时发出警告 缩进的方式使其依赖于制表符的价值 用空格表示。发出一个 选项被给出两次时出错。
对于前。
shadyabhi@archlinux ~ $ cat a
print "Hello World"
shadyabhi@archlinux ~ $ python2 a
Hello World
shadyabhi@archlinux ~ $
如果您想使用$。/ script启动脚本,即使是shebang也是必需的,因为在这种情况下您没有提到要使用的解释器。
答案 2 :(得分:1)
答案 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.pl
,script.exe
,甚至script
。如果脚本具有正确的shebang行,则它将通过正确的解释器传递,否则内核会尝试将其作为可执行文件执行并失败。系统不知道扩展。它们只是用户的惯例,仅此而已。
对于某种脚本,每个计算机解释器中的内容将存储在不同的地方而不是另一个地方?并且脚本无法运行。
如果我理解正确,你会说不同的系统/发行版将口译员保持在不同的地方(例如/usr/bin/python
和/usr/local/bin/python
),并询问系统如何知道使用哪个?
答案是,它使用的是你给它的绝对路径。这实际上是可执行脚本的一个小问题,以及/usr/bin/env
开始流行的原因。正如我所说,env
在PATH
搜索正确的解释器,因此只要您的系统有/usr/bin/env
,就可以设置,您不需要查找或保证口译员的位置。