当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 15 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 10:37 

注册: 2010-05-28 18:00
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
很多教程中都说shell编程第一行一定要是“#!/bin/bash”或者“#!/bin/sh”类似这样的一句告知系统的信息,我想问这个是必须的吗?我今天试了一下,不加这一句我的脚本一样可以运行,所以证明这一句不是必须的。但加和不加有什么区别呢?请知道的朋友帮助解释一下,谢谢!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 11:23 

注册: 2007-02-05 18:09
帖子: 323
送出感谢: 1
接收感谢: 1
不写的时候系统用的是默认的命令解释器,是/bin/sh或者/bin/bash(不太清楚是哪个),所以可以运行。/bin/sh一般链接到/bin/bash,但是bash如果检测到自己是从/bin/sh启动的,会尽量模拟旧式的sh。两者有少数代码不兼容,并且bash略慢。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 12:21 

注册: 2010-05-28 18:00
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
lwbskfish 写道:
不写的时候系统用的是默认的命令解释器,是/bin/sh或者/bin/bash(不太清楚是哪个),所以可以运行。/bin/sh一般链接到/bin/bash,但是bash如果检测到自己是从/bin/sh启动的,会尽量模拟旧式的sh。两者有少数代码不兼容,并且bash略慢。


那我可以这样理解吗:
"#!/bin/bash"只是一个帮助性的语句,对脚本的运行没有实质的影响,写了最好,不写也无所谓,不是必须的。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 12:26 
头像

注册: 2007-09-16 8:29
帖子: 14253
送出感谢: 172
接收感谢: 272
lixinneo 写道:
lwbskfish 写道:
不写的时候系统用的是默认的命令解释器,是/bin/sh或者/bin/bash(不太清楚是哪个),所以可以运行。/bin/sh一般链接到/bin/bash,但是bash如果检测到自己是从/bin/sh启动的,会尽量模拟旧式的sh。两者有少数代码不兼容,并且bash略慢。


那我可以这样理解吗:
"#!/bin/bash"只是一个帮助性的语句,对脚本的运行没有实质的影响,写了最好,不写也无所谓,不是必须的。


有区别。
我认为是必须的。
我这里,如果不写这一句,带case语句的shell运行不正常,写上才正常。


_________________
闻到死太贵, 麦克价更高。 有了笨笨兔, 二者皆可抛。
+ 我的六轮折腾
+ 折腾6轮的结果(对40余种WM的测试和分析,多种DE和WM并存的方案)
+ 折腾的中间成果:可以独立运行的一个Wharf(图标化的启动菜单)
+ 强烈推荐----折腾的终极成果:一个自己开发的DE环境
+ 签名空闲链接位置招租


页首
 用户资料  
 
5 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 12:50 

注册: 2010-05-28 18:00
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
ljj_jjl2008 写道:
lixinneo 写道:
lwbskfish 写道:
不写的时候系统用的是默认的命令解释器,是/bin/sh或者/bin/bash(不太清楚是哪个),所以可以运行。/bin/sh一般链接到/bin/bash,但是bash如果检测到自己是从/bin/sh启动的,会尽量模拟旧式的sh。两者有少数代码不兼容,并且bash略慢。


那我可以这样理解吗:
"#!/bin/bash"只是一个帮助性的语句,对脚本的运行没有实质的影响,写了最好,不写也无所谓,不是必须的。


有区别。
我认为是必须的。
我这里,如果不写这一句,带case语句的shell运行不正常,写上才正常。


我自己试了一下带case的语句,是可以正常运行的,没有问题。用的就是《鸟哥私房菜》的例子sh11.sh,环境是ubuntu10.04。我至今都没有发现加第一句和不加第一句的区别。ljj_jjl2008如果不介意的话能把你的脚本发给我吗?我试试看。谢谢!我的邮箱: [email protected]


页首
 用户资料  
 
6 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 13:16 

注册: 2008-10-31 22:12
帖子: 6546
系统: 践兔
送出感谢: 18
接收感谢: 25
lixinneo 写道:
ljj_jjl2008 写道:
lixinneo 写道:
lwbskfish 写道:
不写的时候系统用的是默认的命令解释器,是/bin/sh或者/bin/bash(不太清楚是哪个),所以可以运行。/bin/sh一般链接到/bin/bash,但是bash如果检测到自己是从/bin/sh启动的,会尽量模拟旧式的sh。两者有少数代码不兼容,并且bash略慢。


那我可以这样理解吗:
"#!/bin/bash"只是一个帮助性的语句,对脚本的运行没有实质的影响,写了最好,不写也无所谓,不是必须的。


有区别。
我认为是必须的。
我这里,如果不写这一句,带case语句的shell运行不正常,写上才正常。


我自己试了一下带case的语句,是可以正常运行的,没有问题。用的就是《鸟哥私房菜》的例子sh11.sh,环境是ubuntu10.04。我至今都没有发现加第一句和不加第一句的区别。ljj_jjl2008如果不介意的话能把你的脚本发给我吗?我试试看。谢谢!我的邮箱: [email protected]

不加就是默认/bin/sh.
估计你那里/bin/sh链接到了bash.


_________________
代码:
] ls -ld //


页首
 用户资料  
 
7 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 13:23 
头像

注册: 2008-05-03 1:53
帖子: 960
送出感谢: 19
接收感谢: 11
这个是有用的,这句就是提示当前shell用什么解释器来执行下面的脚本命令,比如你这句用:
#!/bin/cat就是用cat来执行,那就是把下面的内容显示了一把,其他如perl命令解释器等等类似,
主要是可以利用任何命令来做解释器
如果你没有这一行,shell默认是你在终端输入的命令,直接当前shell执行了


_________________
docker && kubernetes


页首
 用户资料  
 
8 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 13:47 

注册: 2010-05-28 18:00
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
sunfish 写道:
这个是有用的,这句就是提示当前shell用什么解释器来执行下面的脚本命令,比如你这句用:
#!/bin/cat就是用cat来执行,那就是把下面的内容显示了一把,其他如perl命令解释器等等类似,
主要是可以利用任何命令来做解释器
如果你没有这一行,shell默认是你在终端输入的命令,直接当前shell执行了


嗯,谢谢,sunfish应该是说到点子上了。那我就想问问用解释器来执行脚本命令直接用当前shell执行,这两者有区别吗?我感觉运行的结果都是一样的啊。
还有一点,我发现在ubuntu下你在脚本上加了"#!/bin/bash"并不意味着这个脚本一定用bash来执行,譬如你的脚本是scr.sh, 你在终端输入sh scr.sh时, 它是用dash来执行的,并没有因为你加了"#!/bin/bash"它就用bash,不信可以试试,在加了就在脚本里"#!/bin/bash"后写一句: echo -e "Hello World!", 保存为scr.sh,当你终端输入sh scr.sh运行后,屏幕上输出的是"-e Hello World!"。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 13:56 
头像

注册: 2008-11-05 13:24
帖子: 1024
送出感谢: 0 次
接收感谢: 5
sh scr.sh你就是显式使用dash等解析器,而多数脚本本身就不是这么用;
比方说你当前shell是dash,以bash的方式写的脚本有了#!/bin/bash只要系统安装有bash直接执行就是,为什么要强制用不兼容的方式?


_________________
笔记
-------------------------------------
http://blog.163.com/wqt_1101


页首
 用户资料  
 
10 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 18:00 
头像

注册: 2011-11-05 18:53
帖子: 158
地址: 南极圈
送出感谢: 0 次
接收感谢: 7
lixinneo 写道:
sunfish 写道:
这个是有用的,这句就是提示当前shell用什么解释器来执行下面的脚本命令,比如你这句用:
#!/bin/cat就是用cat来执行,那就是把下面的内容显示了一把,其他如perl命令解释器等等类似,
主要是可以利用任何命令来做解释器
如果你没有这一行,shell默认是你在终端输入的命令,直接当前shell执行了


嗯,谢谢,sunfish应该是说到点子上了。那我就想问问用解释器来执行脚本命令直接用当前shell执行,这两者有区别吗?我感觉运行的结果都是一样的啊。
还有一点,我发现在ubuntu下你在脚本上加了"#!/bin/bash"并不意味着这个脚本一定用bash来执行,譬如你的脚本是scr.sh, 你在终端输入sh scr.sh时, 它是用dash来执行的,并没有因为你加了"#!/bin/bash"它就用bash,不信可以试试,在加了就在脚本里"#!/bin/bash"后写一句: echo -e "Hello World!", 保存为scr.sh,当你终端输入sh scr.sh运行后,屏幕上输出的是"-e Hello World!"。

当你用sh来执行的时候,意思是让系统用/bin/sh来执行你的脚本,这种执行方法跟#!/bin/sh没有关系,这样执行加不加都可以。
但当把脚本设置为可执行,并用绝对路径或相对路径来直接执行的时候,就需要有#!/bin/sh了,这句话虽然开头有#号,但并不是注释,因为#后面还有个!,#!是个整体,表示这个脚本需要调用哪个命令解释器。因为能写成脚本的多了,可不只是bash。包括/bin/sed,/usr/bin/awk,/usr/bin/perl,/usr/bin/python等等等等,如果没有那句话,系统只会默认调用/bin/sh(说的是用./scr.sh这种执行方式,你也可以在运行的时候用sed -f scr.sh等等各个命令自己语法来调用)


页首
 用户资料  
 
11 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-08 23:19 

注册: 2008-12-27 15:16
帖子: 46
送出感谢: 0 次
接收感谢: 0 次
这是一个脚本必须的,不只是shell脚本,如果是shell,就这样写,别的脚本有别的写法。
好像csh和bash的脚本就不一样,就需要注明。

如果你写的是python的或者perl的脚本呢?开头也要写明白是python脚本或是perl脚本。
因为就linux系统看来,他们都是文本文件而已。


页首
 用户资料  
 
12 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-09 9:04 

注册: 2008-06-04 12:50
帖子: 88
地址: Beckosecurity
送出感谢: 0 次
接收感谢: 0 次
它的意思就是调用哪一个解释器来执行脚本,比如说python脚本,就是这样的:
代码:
#!/usr/bin/env python

加与不加的区别:
加了的话(文件名:hello.py),可以直接执行
代码:
./hello.py

不加的话会这样
代码:
python hello.py


_________________
www.beckosecurity.com
----
TivooooLi


页首
 用户资料  
 
13 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-09 11:23 
头像

注册: 2008-12-13 15:03
帖子: 395
送出感谢: 0 次
接收感谢: 1
你如果写个csh脚本不写开头,直接运行,必然出错


_________________
一条狗的马甲!
对不起,我承认我是一只穿着马甲的狗!


页首
 用户资料  
 
14 楼 
 文章标题 : 总结: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-09 12:53 

注册: 2010-05-28 18:00
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
感觉论坛里各位朋友的指教,这个问题我基本上搞明白了,下面我来总结一下,如果有不对的地方希望朋友们指正。

1. SHELL里的第一句(类似"#!/bin/bash")是需要的,但不是必须的。不是必须的意思是:你不加,系统一样会用其默认的脚本执行或者用命令强制执行,该脚本是可以运行的。举个例子:你当前在dash下想用bash去执行个名为src.sh的脚本,如果你在脚本第一行加了"#!/bin/bash",在执行时你输入
代码:
./src.sh
,系统就会用bash去执行该脚本,不论你目前使用的是什么shell。如果你在脚本第一行没有加"#!/bin/bash",在执行时你输入
代码:
./src.sh
,系统就会用默认的dash去执行该脚本;或者你可以用命令强制执行,
代码:
bash ./src.sh
,这样也是用bash去执行脚本。所以加不加是可以根据个人需要定的。

2. 另一种情况, 当你的脚本加了第一句"#!/bin/bash",在执行时使用强制执行,
代码:
dash ./src.sh
,那么系统会忽略第一句,用dash去执行你的脚本。

3. 在Ubuntu10.04中, sh默认是指向dash,即你输入sh scr.sh,系统是用dash来执行scr.sh。(其他版本没试过)

根据朋友们指教和自己的实验,我总结出了以上三条,希望能对大家尤其是初学者有帮助。


页首
 用户资料  
 
15 楼 
 文章标题 : Re: SHELL编程第一行的问题,请教!
帖子发表于 : 2012-01-09 13:11 
头像

注册: 2007-11-25 13:29
帖子: 7270
地址: 新疆博乐
系统: 14.04/16.04/Fedroa22
送出感谢: 38
接收感谢: 101
学习了


_________________
===新手请看===
Ubuntu 安装 | Ubuntu12.04/14.04/16.04 桌面操作指南
··Ubuntu16.04 安装图文教程(超简单)
····有时间就静下心来——折腾:)


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 15 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 0 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译