#!/bin/sh简介

第一次学shell编程,看的文章中说shell程序必须以"#!/bin/sh"开始,也就认为是这样了,虽然知道在shell中以"#"开始的语句都是注释,但也从没认为"#!/bin/sh"也是注释,就像对C语言程序必须有main函数一样毫无怀疑。但前些时候又听说"#!/bin/sh"也是注释,可有可无,当时觉得真是一个失败,连基本的语法都分不清。前几天借了一本书,才真正认识了"#!/bin/sh"。shell编程是以"#"为注释,但对"#!/bin/sh"却不是。"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。(#! /bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是解释此脚本的shell的路径)如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell.如果脚本被编写为在Kornshell ksh中运行,而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败。所以建议大家就把"#!/bin/sh"当成C 语言的main函数一样,写shell必须有,以使shell程序更严密。

  一个命令行结束用&

 运行时首先要将文件的权限修改为可执行:chmod +x comdfile

然后要指定执行文件的路径,否则系统会认为执行文件在系统默认目录下。

假如可执行文件在当前的目录下,则:./comdfile ?

 $bash是什么意思?

$表示系统提示符,$ 表示此用户为普通用户,超级用户的提示符是#,bash是shell的一种,是linux下最常用的一种shell,$bash的意思是执行一个子shell,此子shell为bash。

 

 

转载网址:http://blog.sina.com.cn/s/blog_6336857901019zyz.html

 

#!/bin/bash是指此脚本使用/bin/bash来解释执行
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,...
我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。
1)#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。
这里有三个脚本(脚本都要使用”chmod +x  scriptname“命令来获得可执行权限):
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"
 
tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"
 
tbash3.sh:
source abc
echo "hello abc"
 
三个脚本执行的结果:
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh不再往下面执行。
[nsvc@localhost other]$ ./tbash2.sh 
./tbash2.sh: line 2: abc: No such file or directory
hello abc
注:当source命令执行有问题时,bash继续执行下面命令。
[nsvc@localhost other]$ ./tbash3.sh 
./tbash3.sh: line 1: abc: No such file or directory
hello abc
注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。
 
如果将tbash1.sh改成:
echo "abc"
#!/bin/sh
source abc
echo "hello abc"
那么,执行结果是:
[nsvc@localhost other]$ ./tbash1.sh 
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。
 
当把tbash1.sh改成:
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,不在第一行的#!/bin/bash,只是一个注释。
 
2)#!后面的路径一定要正确,不正确会报错。
假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:
#!/home/sh
source abc
echo "hello abc"
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh 
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file or directory
系统会提示/home/sh的路径不存在。
 
3)如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:
-sh-3.2$ ./tbash3.sh 
./tbash3.sh: line 1: abc: 没有那个文件或目录
与1)中的执行结果是不一样的。
因此,大家应该养成脚本首行加上#!+shell路径的习惯。
 
4)/bin/sh相当于/bin/bash --posix
我们将脚本tbash1.sh改为:
#!/bin/bash --posix
source abc
echo "hello abc"
执行结果:
[nsvc@localhost other]$ ./tbash1.sh 
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果一样。
 
我们还可以以tbash3.sh为示例。
用以下命令来执行该脚本:
[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh 
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix tbash3.sh 
tbash3.sh: line 1: abc: No such file or directory
 "bash tbash3.sh"表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh 脚本名“这样的命令,来用sh作为脚本解释器。
从结果可以看出,/bin/bash --posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“
 
最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。
 
总结起来,要规规举举地按照秩序行。

转载于:https://www.cnblogs.com/fengliu-/p/9999854.html

<think>好的,用户的问题是关于Unix/Linux中的脚本、binshebang(#!)相关的内容。首先,我需要确认用户的具体需求。根据用户提到的关键词,可能他们想了解如何编写可执行的脚本,特别是shebang的作用以及相关配置。 首先,我得回顾一下系统提供的引用内容。引用[1]提到搭建运行环境,涉及Bash的使用,引用[2]介绍了ksh,引用[3]和[4]详细解释了shebang的作用。用户可能遇到了脚本执行的问题,或者想了解如何正确设置脚本的解释器。 接下来,我需要整理这些信息,按照用户的要求分点回答,结构要清晰。需要涵盖shebang的定义、用途,如何指定解释器,以及/bin目录的作用。同时,用户可能需要示例来更好地理解,比如给出不同脚本的shebang例子,比如BashPython等。 另外,用户要求生成相关问题,我需要考虑常见的后续问题,比如如何调试脚本执行权限、不同Shell的区别、shebang的最佳实践等。确保这些问题能够帮助用户深入理解主题。 最后,检查是否符合所有格式要求,比如数学表达式是否正确使用$...$,独立公式是否用$$...$$,中文回答,引用标识正确添加等。同时确保LaTeX语法正确,比如命令和路径使用\texttt{}包裹,保持代码块的正确格式。</think>### Unix/Linux脚本中的shebang与/bin目录解析 #### 一、shebang的作用与语法 shebang(#!)是Unix/Linux脚本的第一行声明,用于指定脚本的解释器路径。其语法为: ```shell #!interpreter_path [optional_arg] ``` 例如: ```shell #!/bin/bash # 使用Bash解释器 #!/usr/bin/python3 # 使用Python3解释器 ``` 该声明通过内核加载器识别,当执行脚本时,系统会调用指定解释器执行脚本内容[^3][^4]。若未添加shebang,则默认使用当前Shell解释器,可能导致脚本兼容性问题。 #### 二、/bin目录与解释器路径 Unix/Linux系统中的/bin目录存放核心命令行工具和Shell解释器: - `/bin/sh`:传统Bourne Shell(通常符号链接到其他Shell) - `/bin/bash`:Bourne-Again Shell - `/bin/ksh`:Korn Shell(部分系统默认Shell)[^2] 不同Shell的特性差异: $$ \text{Bash功能} \supset \text{Ksh功能} \supset \text{Sh功能} $$ 建议根据脚本特性选择解释器,如需要数组支持时使用Bash#### 三、创建可执行脚本的步骤 1. 编写脚本文件(如`myscript`): ```shell #!/bin/bash echo "Hello World" date ``` 2. 添加执行权限: ```shell $ chmod +x myscript ``` 3. 执行脚本: ```shell $ ./myscript # 需要当前目录在PATH中,否则需指定路径 ``` #### 四、调试常见问题 1. **解释器路径错误**:若出现`bad interpreter`错误,需确认: - 路径是否存在:`$ which python3` - 是否使用绝对路径 2. **行尾符问题**:Windows编辑的脚本可能出现`^M`错误,使用`dos2unix`转换 3. **权限问题**:通过`ls -l`检查是否有x权限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值