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用户,我对这个"魔术"系列有几个疑问:
这对我来说真的很有趣.什么是这条线?为什么这行?怎么写这一行?为什么会这样?...
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
从联机帮助页:
-t当源文件混合使用制表符和空格进行缩进时,发出警告,使其依赖于以空格表示的制表符的价值.选项被给出两次时发出错误.
对于前者
shadyabhi@archlinux ~ $ cat a
print "Hello World"
shadyabhi@archlinux ~ $ python2 a
Hello World
shadyabhi@archlinux ~ $
Run Code Online (Sandbox Code Playgroud)
如果您想使用$./ script启动脚本,即使是shebang也是必需的,因为在这种情况下您没有提到要使用的解释器.
| 归档时间: |
|
| 查看次数: |
14933 次 |
| 最近记录: |