shell脚本头文件(#!/ bin / sh vs#!/ bin / csh)
为什么所有的脚本文件开始
#!/bin/sh
或与
#!/bin/csh
这是必需的吗? 这是什么目的? 两者有什么区别?
这被称为Shebang
:
http://en.wikipedia.org/wiki/Shebang_(Unix);
#!interpreter [optional-arg]
只有当脚本具有执行权限(例如,chmod u + x script.sh)时,shebang才是相关的。
当一个shell执行脚本时,它将使用指定的解释器。
例:
#!/bin/bash # file: foo.sh echo 1 $ chmod u+x foo.sh $ ./foo.sh 1
#!
行告诉内核(具体来说,执行execve
系统调用)这个程序是用解释语言编写的; 下面的绝对path标识了解释器。 编译成机器码的程序以不同的字节序列开始 – 在大多数现代的Unix上, 7f 45 4c 46
( ^?ELF )标识它们。
你可以把一个绝对path, 你想要的任何程序 #!
,只要那个程序本身不是一个#!
脚本。 内核重写一个调用
./script arg1 arg2 arg3 ...
./script
以#! /usr/bin/perl
开头,例如#! /usr/bin/perl
#! /usr/bin/perl
,好像命令行实际上一样
/usr/bin/perl ./script arg1 arg2 arg3
或者,如你所见,你可以使用#! /bin/sh
#! /bin/sh
来编写一个脚本,以便由sh
解释。
#!
只有直接调用脚本(命令行上的./script
)才能处理行; 该文件也必须是可执行文件( chmod +x script
)。 如果你做sh ./script
#!
行是没有必要的(如果存在,将被忽略),并且该文件不必是可执行的。 这个function的关键是允许你直接调用解释型语言程序,而不必知道他们写了什么语言(做grep '^#!' /usr/bin/*
– 你会发现很多股票程序实际上正在使用此function。)
以下是使用此function的一些规则:
-
#!
必须是文件中的前两个字节 。 特别是,文件必须是ASCII兼容的编码(例如,UTF-8可以工作,但是UTF-16不会),并且不能以“字节顺序标记”开头,否则内核将不能识别为#!
脚本。 -
#!
之后的path#!
必须是绝对path(以/
开头)。 它不能包含空格,制表符或换行符。 - 这是很好的风格,但不是必须的,在
#!
之间放一个空格#!
和/
。 不要在那里放置一个以上的空间。 - 你不能把shellvariables放在
#!
行,他们不会被扩大。 - 你可以把一个命令行参数放在绝对path之后,用一个空格隔开。 像绝对path一样,此参数不能包含空格,制表符或换行符。 (
#! /usr/bin/awk -f
)有时候是必须的,有时它是有用的(#! /usr/bin/perl -Tw
)。 不幸的是,你不能在绝对path之后放两个或更多的参数。 - 有人会告诉你使用
#! /usr/bin/env interpreter
#! /usr/bin/env interpreter
而不是#! /absolute/path/to/interpreter
#! /absolute/path/to/interpreter
。 这几乎总是一个错误。 它使得你的程序的行为取决于调用脚本的用户的$PATH
variables。 并不是所有的系统都具有env
。 - 需要
setuid
或setgid
权限的程序不能使用#!
; 他们必须被编译成机器码。 (如果你不知道setuid
是什么,不要担心这个。)
关于csh
,它大致与Nutrimat 高级茶代用品茶有关。 与sh
它具有(或者更确切地说, sh
现代实现已经被捕获)了许多优点,但是使用它(或其后代tcsh
)进行脚本编写几乎总是一个错误 。 如果您一般对shell脚本不熟悉,我强烈build议您忽略它并专注于sh
。 如果使用csh
亲属作为loginshell,请切换到bash
或zsh
,以便交互式命令语言与您学习的脚本语言相同。
这定义了你用来解释/运行脚本的shell(命令解释器)。 每个shell与用户交互的方式略有不同,并执行脚本(程序)。
在Unix提示符下input命令时,您正在与shell进行交互。
例如, #!/bin/csh
指的是C shell, /bin/tcsh
,t-shell, /bin/bash
,bash shell等
你可以告诉你正在使用哪个交互式shell
echo $SHELL
命令,或者可选地
env | grep -i shell
您可以使用chsh
命令更改命令行。
每一个都有一个稍微不同的命令集和分配variables的方式以及它自己的一组编程结构。 例如,带有bash的if-else语句看起来与C-shell中的不同。
这个页面可能会感兴趣,因为它在bash和tcsh命令/语法之间“转换”。
在shell脚本中使用指令允许您使用不同的shell来运行程序。 例如,我使用交互式的tcsh
shell,但经常在脚本文件中使用/ bin / bash运行bash脚本。
在旁边:
这个概念也扩展到其他脚本。 例如,如果你用Python进行编程,你会放
#!/usr/bin/python
在你的Python程序的顶部