所有脚本文件为什么开始
#!/bin/sh
或
#!/bin/csh
是必需的? 什么是这样做的目的是什么? 什么是两者之间的区别?
所有脚本文件为什么开始
#!/bin/sh
或
#!/bin/csh
是必需的? 什么是这样做的目的是什么? 什么是两者之间的区别?
这就是所谓的Shebang
:
http://en.wikipedia.org/wiki/Shebang_(Unix)
#!解释[可选-参数]
当脚本有执行权限(例如CHMOD U + X script.sh)一个家当仅是相关的。
当一个shell执行脚本,它将使用指定的解释。
例:
#!/bin/bash
# file: foo.sh
echo 1
$ chmod u+x foo.sh
$ ./foo.sh
1
该#!
行告诉内核(具体而言,执行execve
系统调用),这个程序是用一种解释性语言; 下面的绝对路径标识解释。 编译成机器代码的程序开始用不同的字节序列-在大多数现代Unix系统, 7f 45 4c 46
标识它们的方式(^ ELF?)。
你可以把绝对路径给你后想要的任何程序 #!
,只要该程序本身不是#!
脚本。 内核重写的调用
./script arg1 arg2 arg3 ...
其中./script
开头,比如说, #! /usr/bin/perl
#! /usr/bin/perl
,因为如果在命令行实际上曾经一向是
/usr/bin/perl ./script arg1 arg2 arg3
或者,正如你所看到的,你可以使用#! /bin/sh
#! /bin/sh
编写旨在通过解释脚本sh
。
该#!
如果直接调用脚本(线仅处理./script
在命令行上); 该文件也必须是可执行文件( chmod +x script
)。 如果你这样做sh ./script
的#!
线是没有必要的(如果存在的话会被忽略),该文件并不一定是可执行的。 该功能的要点是允许你直接调用解释语言程序,而不必知道他们在写什么语言(做的。 grep '^#!' /usr/bin/*
-你会发现许许多多股票程序在使用该功能的事实。)
下面是使用此功能的一些规则:
#!
必须是文件中的第一个两个字节 。 特别是,文件必须是一个ASCII兼容的编码(如UTF-8将工作,但UTF-16不会),并不能以“字节顺序标记”开始,或者内核将不会承认它作为一个#!
脚本。 #!
必须是绝对路径(开头/
)。 它不能包含空格,制表符,或换行符。 #!
和/
。 不要把一个以上的空间存在。 #!
行,他们将不会扩大。 #! /usr/bin/awk -f
),有时它只是有用( #! /usr/bin/perl -Tw
)。 不幸的是,你不能把两个或多个参数的绝对路径之后。 #! /usr/bin/env interpreter
#! /usr/bin/env interpreter
,而不是#! /absolute/path/to/interpreter
#! /absolute/path/to/interpreter
。 这几乎总是错误的。 它使你的程序的行为依赖于$PATH
谁调用脚本的用户的变量。 而且并非所有的系统都有env
摆在首位。 setuid
或setgid
特权不能使用#!
; 他们必须被编译成机器代码。 (如果你不知道什么是setuid
是,不用担心这一点。) 关于csh
,它涉及到sh
作为Nutrimat大致高级茶替代不喝茶。 它(或者说有;现代实现sh
赶上)一批在优势sh
交互使用,但使用它(或其后代tcsh
)的脚本是几乎总是错误的 。 如果你是新的,一般到shell脚本,我强烈建议你忽略它,专注于sh
。 如果你使用的是csh
亲戚作为你的登录shell,切换到bash
或zsh
,使交互式命令语言是一样的,你正在学习的脚本语言。
这将定义您使用的解释/运行脚本什么shell(命令解释器)。 每个壳的方式略有不同的是与用户交互并执行脚本(程序)。
当你在命令在UNIX提示符下键入,你与外壳进行交互。
例如, #!/bin/csh
指的C-shell, /bin/tcsh
T型外壳, /bin/bash
使用bash shell等
你可以告诉你正在使用的交互式壳
echo $SHELL
命令,或者可替换地
env | grep -i shell
您可以通过改变你的命令shell chsh
命令。
每个人都有分配变量的一个稍微不同的命令集和方式以及其自己的一套编程结构。 比如在if-else语句使用bash看起来不同的是,一个在C壳。
此页面可能会感兴趣,因为它的bash和tcsh命令/语法之间的“翻译”。
在shell脚本中使用指令允许您运行使用不同的外壳程序。 比如我用tcsh
外壳交互,但经常使用的脚本文件/斌/ bash中运行的bash脚本。
在旁边:
这个概念延伸到其他脚本了。 例如,如果你在Python程序,你就会把
#!/usr/bin/python
在你的Python程序的顶部