#!/bin/sh与#:/bin/sh之间的区别

4
今天有人发送了一个以#号开头的脚本给我,通过谷歌搜索后没有找到任何答案。尽管脚本可以正常运行,但我还是想知道它的含义。

他或她在提到#!时可能打错了字。 - Diego Sevilla
2个回答

13

哇!这让我回忆起了很多往事!

在20世纪80年代和90年代初,有两个基本的shell,Bourne shell(/bin/sh)和C shell(/bin/csh)。

Bourne shell没有太多用户友好的功能。没有别名或命令替换。因此,大多数人喜欢使用C Shell作为默认shell。

然而,Csh是一种可怕的脚本语言。(请参阅http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)。因此,您使用C shell作为shell,但在Bourne shell中编写脚本,因为它具有更好的语法。

但是,有一个微小的问题:由于您的默认shell是C Shell,在命令行上键入shell脚本名称,C Shell会接收并尝试执行它。

为了解决这个问题,您将:放在程序的第一行。这是Bourne shell的注释,但是却是无效的C Shell命令。因此,如果您忘记在前面加上sh,则脚本将无法运行。

后来,系统会知道如果第一行是:,它应该是一个Bourne shell脚本。甚至更晚一些,您可以放置#:,以便它成为注释而不是命令。有些人在旁边放置shell的名称/bin/sh,以帮助提醒人们应该将其作为Bourne shell脚本运行。

C shell在Kornshell变得流行之后逐渐消失了。就在这个时候,shebang(“#!”)出现了,但那只是针对AT&T而不是Berkeley衍生系统的。BSD系统直到1980年代末才有shebang。而Sun人使用C Shell作为默认Shell,直到Solaris问世。

我已经很久没有见过以“#: /bin/sh”开头的程序了。

顺便说一句,常见的启动脚本方式如下:

#! /usr/bin/env perl

这样,您就可以使用路径中的Perl版本,而不必担心它在哪个目录中。例如,如果您的脚本以以下方式开始:

#! /usr/local/bin/perl

而且,Perl实际上在/usr/bin中,因此您的脚本无法运行。 env程序始终在/usr/bin中,并保证正常工作。当然,如果您想使用特定版本的Perl而不是路径中的版本,则应使用第一种方法。


有一些奇怪的系统在其他地方使用env,我相信。 - Dennis Williamson
非常感谢这个相关而完整的回答!! - Vlagorce
@Dennis:我确实不知道有些系统使用/bin/env而不是/usr/bin/env。这使得事情变得更加棘手。然而,指出的两个系统是SCO的OpenServer和Cray UNICO(或类似的东西)。我已经好几年没见过Cray了,而且我认为SCO也不会再存在太久了。好吧,/usr/bin/env并不是普遍适用的,但它非常接近。甚至连普遍的<a href="http://en.wikipedia.org/wiki/Fine-structure_constant">fine-structure constant</a> Alpha也可能不是普遍适用的。 - David W.
为了避免创建会摧毁我们所有人的微型黑洞,请在评论中使用 [text](http://example.com) 形式的链接,而不是 <a href>... ;) - Dennis Williamson

2

This is a comment only...

#:/bin/sh

一个shebang是 #!。其他以#开头的都是注释。
例如:
运行以以下方式开头的脚本:
#!/usr/bin/perl

这段代码与IT技术有关,它将由Perl运行。现在,将'!'替换为':',您将使用默认解释器(即您的shell)运行它。


完全正确。只是一个小提示。由于历史原因,在“#!”后面最好加一个空格。 - Diego Sevilla
@Diego:我相信这些历史原因与那些已经过时且不再使用的系统有关,现在没有人再使用这些空间了。 - Jonathan Leffler
你也可以使用“#! /usr/bin/env perl”。这样,只要“perl”在你的$PATH环境变量中,脚本就能正常工作。我曾经遇到过Perl安装在/bin、/usr/bin/或/usr/local/bin的系统。当你在一个系统上测试脚本并因为在另一台机器上将“#! /bin/perl”放入脚本而失败时,这是很痛苦的。 - David W.
@Jonathan:嗯,我用它们,可能是出于怀旧之情 :) @David:这很不错。 - Diego Sevilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接