sh和bash之间的区别
在编写shell程序时,我们经常使用/bin/sh
和/bin/bash
。 我通常使用bash
,但我不知道它们之间有什么区别。
bash
和sh
之间的主要区别是什么?
在bash
和sh
编程时我们需要注意什么?
什么是sh
sh
(或Shell命令语言)是POSIX标准描述的编程语言。 它有许多实现( ksh88
, dash
,...)。 bash
也可以被认为是sh
一个实现(见下文)。
因为sh
是一个规范,而不是实现,所以/bin/sh
是在大多数POSIX系统上实际实现的符号链接(或硬链接)。
什么是bash
bash
开始是一个sh
兼容的实现(虽然它早于POSIX标准几年),但随着时间的推移它已经获得了许多扩展。 这些扩展中的很多可能会改变有效的POSIX shell脚本的行为,因此bash
本身不是有效的POSIX shell。 相反,它是POSIX shell语言的一种方言。
bash
支持一个--posix
开关,这使得它更符合POSIX标准。 如果调用sh
它也会尝试模仿POSIX。
sh = bash?
很长一段时间, /bin/sh
用于在大多数GNU / Linux系统上指向/bin/bash
。 结果,忽略两者之间的差异几乎变得安全了。 但最近开始发生变化。
/bin/sh
不指向/bin/bash
(甚至有些/bin/bash
甚至可能不存在)的一些流行的系统示例如下:
sh
dash
; initramfs
一部分运行。 它使用ash
壳实现。 pdksh
,它是Korn shell的后代。 FreeBSD的sh
是原始UNIX Bourne shell的后代。 Solaris提供了自己的sh
其中很长一段时间不符合POSIX标准; Heirloom项目提供免费的实现。 如何找出系统上的/bin/sh
指向的内容?
复杂的是/bin/sh
可能是一个符号链接或硬链接。 如果它是一个符号链接,那么解决它的一种便携方式是:
% file -h /bin/sh
/bin/sh: symbolic link to bash
如果这是一个硬链接,请尝试
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
事实上, -L
标志涵盖了符号链接和硬链接,但这种方法的缺点是它不可移植 - POSIX不需要find
来支持-samefile
选项,尽管GNU find和FreeBSD都支持它。
Shebang线
最终,由你来决定使用哪一个,通过编写«shebang»系列。
例如
#!/bin/sh
将使用sh
(以及发生的任何指向),
#!/bin/bash
如果可用,将使用/bin/bash
如果不是,则会失败并显示错误消息)。 当然,你也可以指定另一个实现,例如
#!/bin/dash
使用哪一个
对于我自己的脚本,我更喜欢sh
,原因如下:
bash
,它们也必须有sh
使用bash
也有好处。 其功能使得编程更加方便,并且与其他现代编程语言的编程类似。 这些包括诸如作用域局部变量和数组之类的东西。 Plain sh
是一种非常简约的编程语言。
sh
:http://man.cx/sh
bash
:http://man.cx/bash
TL; DR : bash
是sh
的超集,具有更优雅的语法和更多的功能。 几乎在所有情况下使用bash shebang线是安全的,因为它在现代平台上非常普遍。
注意:在某些环境中, sh
是bash
。 检查sh --version
。
从UNIX.COM发布
壳牌功能
下表列出了我认为可以让您选择一个shell而不是另一个的大多数功能。 它并不打算成为一个明确的列表,也不包括每个可能shell的每一个可能的特性。 只有在操作系统附带的版本中才会将功能视为在shell中,或者如果可以直接从标准分发中编译,则可以使用该功能。 特别是下面指定的C shell可以在SUNOS 4上找到。*,相当多的供应商现在可以运行tcsh或自己的增强型C shell(它们并不总是很明显地表明它们正在运行tcsh。
码:
sh csh ksh bash tcsh zsh rc es
Job control N Y Y Y Y Y N N
Aliases N Y Y Y Y Y N N
Shell functions Y(1) N Y Y N Y Y Y
"Sensible" Input/Output redirection Y N Y Y N Y Y Y
Directory stack N Y Y Y Y Y F F
Command history N Y Y Y Y Y L L
Command line editing N N Y Y Y Y L L
Vi Command line editing N N Y Y Y(3) Y L L
Emacs Command line editing N N Y Y Y Y L L
Rebindable Command line editing N N N Y Y Y L L
User name look up N Y Y Y Y Y L L
Login/Logout watching N N N N Y Y F F
Filename completion N Y(1) Y Y Y Y L L
Username completion N Y(2) Y Y Y Y L L
Hostname completion N Y(2) Y Y Y Y L L
History completion N N N Y Y Y L L
Fully programmable Completion N N N N Y Y N N
Mh Mailbox completion N N N N(4) N(6) N(6) N N
Co Processes N N Y N N Y N N
Builtin artithmetic evaluation N Y Y Y Y Y N N
Can follow symbolic links invisibly N N Y Y Y Y N N
Periodic command execution N N N N Y Y N N
Custom Prompt (easily) N N Y Y Y Y Y Y
Sun Keyboard Hack N N N N N Y N N
Spelling Correction N N N N Y Y N N
Process Substitution N N N Y(2) N Y Y Y
Underlying Syntax sh csh sh sh csh sh rc rc
Freely Available N N N(5) Y Y Y Y Y
Checks Mailbox N Y Y Y Y Y F F
Tty Sanity Checking N N N N Y Y N N
Can cope with large argument lists Y N Y Y Y Y Y Y
Has non-interactive startup file N Y Y(7) Y(7) Y Y N N
Has non-login startup file N Y Y(7) Y Y Y N N
Can avoid user startup files N Y N Y N Y Y Y
Can specify startup file N N Y Y N N N N
Low level command redefinition N N N N N N N Y
Has anonymous functions N N N N N N Y Y
List Variables N Y Y N Y Y Y Y
Full signal trap handling Y N Y Y N Y Y Y
File no clobber ability N Y Y Y Y Y N F
Local variables N N Y Y N Y Y Y
Lexically scoped variables N N N N N N N Y
Exceptions N N N N N N N Y
上表中的关键。
Y功能可以使用这个shell来完成。
N特征不存在于外壳中。
F功能只能通过使用shell函数机制来完成。
L readline库必须链接到shell才能启用此功能。
上表中的注释
1. This feature was not in the original version, but has since become
almost standard.
2. This feature is fairly new and so is often not found on many
versions of the shell, it is gradually making its way into
standard distribution.
3. The Vi emulation of this shell is thought by many to be
incomplete.
4. This feature is not standard but unofficial patches exist to
perform this.
5. A version called 'pdksh' is freely available, but does not have
the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.
链接地址: http://www.djcxy.com/p/25611.html
上一篇: Difference between sh and bash
下一篇: Stop on first error