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这几乎总是一个错误。 它使得你的程序的行为取决于调用脚本的用户的$PATHvariables。 并不是所有的系统都具有env
  • 需要setuidsetgid权限的程序不能使用#! ; 他们必须被编译成机器码。 (如果你不知道setuid是什么,不要担心这个。)

关于csh ,它大致与Nutrimat 高级茶代用品茶有关。 与sh它具有(或者更确切地说, sh现代实现已经被捕获)了许多优点,但是使用它(或其后代tcsh )进行脚本编写几乎总是一个错误 。 如果您一般对shell脚本不熟悉,我强烈build议您忽略它并专注于sh 。 如果使用csh亲属作为loginshell,请切换到bashzsh ,以便交互式命令语言与您学习的脚本语言相同。

这定义了你用来解释/运行脚本的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程序的顶部