我创建了一个复杂的长行命令来成功登录站点。如果我在Console中执行它就可以了。但是,如果我在bash脚本中复制并粘贴相同的行,则无效。
我尝试了很多东西,但偶然发现如果我不使用这条线
#!/bin/sh
它起作用了!为什么会在我的mac OSX Lion中发生这种情况?这个配置行在bash脚本中的作用是什么?
答案 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之前没有空格或空行,否则它将无效。