首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#!/bin/sh和#:/bin/sh的区别

#!/bin/sh和#:/bin/sh的区别
EN

Stack Overflow用户
提问于 2010-11-25 00:08:27
回答 2查看 951关注 0票数 4

今天有人给我发了一个以#:开头的脚本,在谷歌搜索后,我没有找到任何答案。

即使脚本起作用了,我也想知道这意味着什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-25 07:09:08

哇!这让我回想起很多回忆!

回到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,但是在Bourne shell中编写脚本,而Bourne shell具有更好的语法。

但是,有一个小问题:因为您的默认shell是C Shell,所以在命令行中键入一个shell脚本名称,C Shell将获取它并尝试执行它。

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

稍后,系统将知道第一行是否为:,它应该是一个Bourne shell脚本。而且,即使在以后,您也可以将#:放入其中,这样它就是一个注释而不是一个命令。有些人把外壳的名字,/bin/sh放在它的旁边,以帮助提醒人们应该把它作为一个伯恩外壳脚本运行。

在Kornshell开始流行之后,C shell开始消亡。就在这个时候,shebang (#!)出现了,但这只适用于AT&T,而不适用于伯克利派生的系统。BSD系统直到20世纪80年代末才开始流行起来。而且,在Solaris问世之前,Sun people一直使用C Shell作为默认shell。

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

顺便说一句,脚本通常是这样启动的:

代码语言:javascript
复制
#! /usr/bin/env perl

这样,您就可以使用path中的Perl版本,而不必担心它在哪个目录中。例如,如果您的脚本开头为:

代码语言:javascript
复制
#! /usr/local/bin/perl

而且,Perl实际上是在/usr/bin中,您的脚本不会运行。env程序始终在/usr/bin中,并且可以保证正常工作。当然,如果您想使用特定版本的Perl,而不是path中的版本,那么可以使用第一种方法。

票数 13
EN

Stack Overflow用户

发布于 2010-11-25 00:19:22

这只是一条评论...

代码语言:javascript
复制
#:/bin/sh

谢邦是#!其他所有以#开头的内容都是注释。

示例:

运行以开头的脚本

代码语言:javascript
复制
#!/usr/bin/perl

它将由perl运行。现在,将“!”通过“:”,您将使用默认解释器运行它,这是您的shell。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4268845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档