Bash:带有curl的bash脚本中“#!/ bin / sh”的作用是什么

时间:2012-05-25 22:57:48

标签: bash curl

我创建了一个复杂的长行命令来成功登录站点。如果我在Console中执行它就可以了。但是,如果我在bash脚本中复制并粘贴相同的行,则无效。

我尝试了很多东西,但偶然发现如果我不使用这条线

#!/bin/sh
它起作用了!为什么会在我的mac OSX Lion中发生这种情况?这个配置行在bash脚本中的作用是什么?

3 个答案:

答案 0 :(得分:4)

通过/bin/sh运行的bash脚本以 sh兼容模式运行,这意味着许多特定于bash的功能(herestrings,进程替换等)不会工作。

sh-4.2$ cat < <(echo 123)
sh: syntax error near unexpected token `<'

如果您希望能够使用完整的bash语法,请使用#!/bin/bash作为shebang行。

答案 1 :(得分:1)

“#!/ bin / sh”是一种常见的习惯用语,用于确保使用正确的解释器来运行脚本。这里,“sh”是“Bourne Shell”。 shell脚本的一个好的,标准的“最小公分母”。

但是,在您的情况下,“#!/ bin / sh”似乎是错误的解释器。

这里有更多信息:

  

http://www.unix.com/answers-frequently-asked-questions/7077-what-does-usr-bin-ksh-mean.html

     

最初,我们在unix上只有一个shell。当你要求运行一个   命令,shell将尝试调用其中一个exec()系统   呼吁它。命令是可执行文件,exec会成功   并且命令将运行。如果exec()失败,shell就不会   放弃,而是尝试将命令文件插入就像它一样   是一个shell脚本。

     

然后unix获得了更多的炮弹,情况变得混乱。最   人们会在一个shell中编写脚本,在另一个shell中键入命令。   并且每个shell都有不同的规则来为脚本提供脚本   解释

     

这是发明“#!/”技巧的时候。这个想法是为了让   kernel的exec()系统调用使用shell脚本成功。当。。。的时候   内核尝试exec()一个文件,它查看前4个字节   表示一个称为幻数的整数。这告诉内核是否   它应该尝试运行该文件。所以“#!/”被添加到魔法中   内核知道的数字,它实际上已经扩展到了   单独运行shell脚本。但是有些人不能输入“#!/”,   他们不断离开这个空间。所以内核再次被激活了一下   允许“#!/”作为一个特殊的3字节幻数。

     

所以#! /usr/bin/ksh和   #!/usr/bin/ksh现在意味着同样的事情。我总是使用前者,因为至少有些内核可能仍然存在,不理解   后者。

     

请注意,第一行是内核的信号,而不是内核的信号   贝壳。现在发生的是当shell尝试通过脚本运行时   exec()他们只是成功了。我们永远不会发现他们的各种各样   后备计划。

答案 2 :(得分:0)

脚本的第一行可用于选择要使用的脚本解释器。

使用

#!/bin/bash

您告诉shell调用/ bin / bash解释器来执行您的脚本。 确保在#!/ bin / bash之前没有空格或空行,否则它将无效。

相关问题