bash 和 sh 有什么区别?

Sai*_*han 27 unix bash shell

我看到正在使用两种类型的代码:

#!/usr/bin/sh
Run Code Online (Sandbox Code Playgroud)

和:

#!/user/bin/bash
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了这个,意见分歧很大。我在大多数网站上看到的解释都说sh比 旧bash,并且没有真正的区别。

有人知道这些之间的区别吗?你能给我一个实际的例子,什么时候使用一个而不是另一个?

Nif*_*fle 33

bashshie的超集。你可以做的一切你都sh可以做bash

Bash 具有更多功能(分支、内置函数、数组),使脚本更易于编写。一些后来的 *nix'es 有/bin/sh链接到/bin/bash

有关这里的教程的完整说明

  • 我很确定 Dash 完全符合 sh 标准。问题是有些人写的脚本说 /bin/sh,但脚本本身需要 /bin/bash 才能工作。没有人注意到问题,因为大多数时候,/bin/sh 只是指向/bin/bash。 (8认同)
  • @Saif:`sh` 没有被简单地扩展还有另一个原因:它的源代码是纯粹的地狱。[看一看。](http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh) *应该*是C... (8认同)
  • 删除 `sh` 会破坏许多脚本,这些脚本期望它存在并依赖于它解析事物的方式。Linux 用户可能不在乎,但在 Solaris、AIX 或 HP-UX 上花费数千美元的人可能会非常恼火。 (7认同)
  • @Saif Bechan:Bourne shell (`sh`) 不只是扩展的一个原因是 Bash` 是由其他人编写的。此外,我敢打赌存在许可证问题。阅读有关 Bourne Shell 的文章 http://en.wikipedia.org/wiki/Bourne_shell (5认同)
  • ...为了更有趣,Ubuntu 符号链接 /bin/sh 来破折号。Dash 并不完全符合 sh 或 bash 标准,但应该可以更快地启动。当系统启动时,所有 init.d 脚本都会运行,我想节省的时间总体上是值得的。 (3认同)
  • @grawity 另一个手册页也适用于 ash,但它 [在 4.4BSD Lite2 中称为 sh](http://www.in-ulm.de/~mascheck/various/ash/#freebsd)。[原始 Bourne shell](http://www.in-ulm.de/~mascheck/bourne/) 不支持 `$()`。 (2认同)

njd*_*njd 6

传统上,/bin/sh 应该是原始的 Bourne shell,它没有历史记录或命令行编辑,也没有作业控制。

大约在过去 15 年左右的时间里,大多数 Unix 都安装了 POSIX shell,或者至少安装了 ksh 或 bash(它们非常接近 POSIX),但在 /bin/sh 中仍然有更有限的 shell

这样做的原因是期望旧sh命令的旧 shell 脚本仍然可以工作。
由于像{,}!bash 这样的字符对 bash 具有特殊含义,因此使用这些字符(不转义它们)的旧 shell 脚本可能会失败。
(Bourne shell 会按!!{1,2}字面意思理解,而 bash 会将其解释为前一个命令 ( !!)的重复,后跟括号扩展)。

但在 Linux 上,该sh命令几乎总是指向 的链接bash,具有所有相同的功能。

  • 如果作为 /bin/sh 调用,Bash 应该(但并不总是)在 sh 兼容模式下运行。当 Ubuntu 将 /bin/sh 从链接到 /bin/bash 切换到链接到 /bin/dash 时,很多东西都坏了。当他们应该使用标准 sh 时,破坏假设的 bashisms 的东西。 (2认同)