我看到正在使用两种类型的代码:
#!/usr/bin/sh
和:
#!/user/bin/bash
我在网上搜索了此内容,意见分歧很大。我在大多数网站上看到的解释sh
都比早bash
,并且没有真正的区别。
有人知道两者之间的区别吗?您能给我一个实际的例子,何时在另一个上使用?
我看到正在使用两种类型的代码:
#!/usr/bin/sh
和:
#!/user/bin/bash
我在网上搜索了此内容,意见分歧很大。我在大多数网站上看到的解释sh
都比早bash
,并且没有真正的区别。
有人知道两者之间的区别吗?您能给我一个实际的例子,何时在另一个上使用?
Answers:
bash
是的超集sh
。一切你可以做sh
你能做的bash
。
Bash具有更多功能(分支,内置插件,数组),使脚本更易于编写。稍后的* nix /bin/sh
链接为/bin/bash
有关此教程的完整说明
sh
)不仅被扩展的原因之一是Bash是由其他人编写的。我也敢打赌,那里有许可证问题。阅读有关Bourne Shell的文章en.wikipedia.org/wiki/Bourne_shell
sh
会破坏很多脚本,这些脚本期望它存在并且依赖于它解析事物的方式。Linux用户可能不在乎,但是在Solaris,AIX或HP-UX上花费数千美元的人们可能会非常恼火。
传统上,/ bin / sh是原始的Bourne shell,没有历史记录或命令行编辑,也没有作业控制。
在大约15年左右的时间里,大多数Unix都安装了POSIX shell,或者至少安装了ksh或bash(它们几乎类似于POSIX),但是在/ bin / sh中仍然具有更有限的shell。
这样做的原因是希望旧sh
命令的旧外壳脚本仍然可以使用。
由于字符{
,}
和!
对bash具有特殊含义,因此使用这些字符(不转义)的较旧的shell脚本可能会失败。
(Bourne shell将按!!{1,2}
字面意义使用,而bash会将其解释为前一个命令(!!
)的重复,然后是大括号扩展)。
但是,在Linux上,该sh
命令几乎始终只是bash
具有所有相同功能的的链接。
sh可以表示Bourne shell或/ bin / sh,这是大多数现代平台上的其他一些(符合POSIX的)shell。“ POSIX shell”是POSIX定义的抽象shell,它由bash在POSIX模式下实现,或者默认情况下由ksh或dash实现。/ bin / sh有时也称为POSIX shell,因为它是在大多数平台上都符合POSIX的shell。原始的Bourne外壳不是POSIX外壳。
bashref列出了bash和Bourne shell之间的差异。在POSIX模式下调用bash时,man bash
有一个更改列表。
/ bin / sh在OS X上不是符号链接或硬链接,但其大小几乎与/ bin / bash相同:
$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x 1 root wheel 1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x 1 root wheel 1334000 Jul 26 01:52 /bin/sh
如果使用名称sh调用bash,则它会尝试尽可能接近于sh的历史版本的启动行为,同时也要符合POSIX标准。
否则,对Bourne贝壳的模仿非常有限。bash +B
(Bourne)实际上会禁用括号扩展之类的功能。
$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}
但是,即使禁用POSIX模式,echo -e
默认情况下,echo的行为也类似于:
$ sh
$ shopt -uo posix
$ echo '1\b2'
2
/ bin / sh在Ubuntu上是破折号,因此在OS X上某些bashisms可与/ bin / sh一起使用,但在Ubuntu上不行。
如果您确实想为原始的Bourne shell(类似)编写脚本,则可以#!/usr/bin/env bash +B
改用。
我认为为bash编写脚本比避免不属于POSIX规范或Bourne shell或不使用其他shell测试所有内容的功能要容易。
在许多系统上,尤其是在Solaris上,bash是动态链接的,而sh是静态链接的。这可能会构成安全威胁,因此,root用户仅应将/ bin / sh用作shell(如果您需要以root身份登录)。
ldconfig
或者/lib
由于某种原因您的目录被清除,在紧急情况下也很有用。
sh
andbash
)的一般概述,请访问:http