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
Key to the table above.
Y功能可以使用此shell完成 .
外壳中不存在N功能 .
F功能只能通过使用shell功能机制来完成 .
L必须将readline库链接到shell以启用此功能 .
Notes to the table above
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.
9 回答
sh
:http://man.cx/shbash
:http://man.cx/bashTL;DR :
bash
是sh
的超集,具有更优雅的语法和更多功能 . 几乎在所有情况下使用bash shebang系列是安全的,因为它在现代平台上非常普遍 .注意:在某些环境中,
sh
是bash
. 检查sh --version
.TERMINAL
程序放了一个窗口
xterm,rxvt,konsole,kvt,gnome-terminal,nxterm和eterm .
SHELL
是在终端中运行的程序
Shell既是命令解释器又是编程语言
Shell只是一个执行命令的宏处理器 .
宏处理器是指扩展文本和符号以创建更大表达式的功能 .
SH Vs. BASH
SH
(SHell)
是一个特定的shell
命令解释器和编程语言
BASH的前身
BASH
(Bourne-Again SHell)
是一个特定的shell
命令解释器和编程语言
具有sh功能等
SH的继承人
BASH是默认的SHELL
REFERENCE MATERIAL:
SHELL gnu.org:
BASH gnu.org:
对于试图使用
sh
的人来说,这个问题经常被提名为规范,并且惊讶于它的行为与bash
. 以下是常见误解和陷阱的快速概述 .首先,您应该了解会发生什么 .
如果使用
sh scriptname
运行脚本,或者使用scriptname
运行它并且shebang行中有#!/bin/sh
,则应该期望POSIXsh
行为 .如果使用
bash scriptname
运行脚本,或者使用scriptname
运行它并且在shebang行中有#!/bin/bash
(或本地等效项),则应该期望Bash行为 .拥有正确的shebang并通过仅键入脚本名称(可能具有相对路径或完整路径)来运行脚本通常是首选解决方案 . 除了正确的shebang之外,这还要求脚本文件具有执行权限(
chmod a+x scriptname
) .那么,它们实际上有何不同?
Bash参考手册有一个section which attempts to enumerate the differences,但一些常见的混淆来源包括
[[
在sh
中不可用(仅[
,这更笨重且有限) .sh
没有数组 .某些Bash关键字(如
local
,function
和select
)无法移植到sh
.Bash有许多C风格的语法扩展,如
$'string\nwith\tC\aescapes'
和三参数for((i=0;i<=3;i++))
循环,+=
增量赋值等 .Bash支持
<<<'here strings'
.Bash有
*.{png,jpg}
和{0..9}
大括号扩展 .~仅在Bash中引用$ HOME(更常见的是〜用户名到主用户名的用户名) . 这是在POSIX中,但可能正在从某些POSIX
/bin/sh
实现之前进行 .Bash使用
<(cmd)
和>(cmd)
替换进程 .Bash支持具有
<>
重定向的协同处理 .Bash显着扩展了shell算法(尽管仍然没有浮点支持)和变量子串操作的设施,包括
${substring:1:2}
,${variable/pattern/replacement}
,大小写转换等 .许多,仅限Bash的扩展,用于启用或禁用可选行为并公开shell的内部状态 .
用于交互式使用的许多便利功能但不影响脚本行为 .
请记住,这是一个简略的列表 . 有关完整的独家新闻,请参阅参考手册;有关许多良好的解决方法,请参阅http://mywiki.wooledge.org/Bashism;和/或尝试http://shellcheck.net/,警告许多Bash功能 .
常见的错误是
#!/bin/bash
shebang行,但是然后使用sh scriptname
来实际运行脚本 . 这基本上禁用任何仅限Bash的功能,因此您会收到语法错误,例如尝试使用数组 .不幸的是,当您尝试使用这些构造时,Bash不会发出警告,因为它被调用为
sh
. 它也没有完全禁用所有Bash功能,所以通过调用它来运行Bash为sh
不是检查脚本是否可以正确移植到ash / dash / POSIX sh或类似Heirloom sh等变体的好方法Linux操作系统提供不同类型的shell . 虽然shell有许多共同的命令,但每种类型都有独特的功能 . 让我们研究一下最常用的贝壳 .
Sh shell:
Sh shell也称为Bourne Shell . Sh shell是1977年AT&T贝尔实验室的Stephen Bourne为Unix计算机开发的第一个shell . 它包含许多脚本工具 .
Bash shell :
Bash shell代表Bourne Again Shell . Bash shell是大多数linux发行版中的默认shell,替代Sh Shell(Sh shell也将在Bash shell中运行) . Bash Shell无需修改即可执行绝大多数Sh shell脚本,并提供命令行编辑功能 .
什么是sh
sh
(或Shell命令语言)是POSIX standard描述的编程语言 . 它有许多实现(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
甚至可能不存在)的系统的一些常见示例是:现代Debian和Ubuntu系统,默认情况下符号链接
sh
到dash
;Busybox,通常在Linux系统启动时作为一部分运行of
initramfs
. 它使用ash
shell实现 .BSD,通常是任何非Linux系统 . OpenBSD使用
pdksh
,它是Korn shell的后代 . FreeBSD的sh
是原始UNIX Bourne shell的后代 . Solaris有自己的sh
,很长一段时间不符合POSIX标准; Heirloom project提供免费实施 .你怎么能找到
/bin/sh
指向你系统的内容?复杂的是
/bin/sh
可能是符号链接或硬链接 . 如果它是一个符号链接,解决它的方法是:如果这是一个硬链接,请尝试
事实上,
-L
标志涵盖符号链接和硬链接,但这种方法的缺点是它不可移植 - 支持-samefile
选项,尽管GNU find和FreeBSD find都支持它 .Shebang线
最终,由你来决定使用哪一个,通过编写«shebang»系列 .
例如 .
将使用
sh
(以及任何恰好指向的东西),将使用
/bin/bash
如果's available (and fail with an error message if it'不是) . 当然,您也可以指定其他实现,例如使用哪一个
对于我自己的脚本,我更喜欢
sh
,原因如下:它是标准化的
它更简单,更容易学习
它可以跨POSIX系统移植 - 即使它们没有
bash
,它们也需要sh
使用
bash
也有优势 . 它的功能使编程更方便,类似于其他现代编程语言的编程 . 这些包括范围局部变量和数组 . Plainsh
是一种非常简约的编程语言 .Shell 是用户和操作系统之间用于访问操作系统服务的接口 . 它可以是GUI或CLI(命令行界面) .
sh (Bourne sh ell)是一个shell命令行解释器,适用于Unix / Unix类操作系统 . 它提供了一些内置命令 . 在脚本语言中,我们将解释器表示为
#!/bin/sh
. 它是其他shell最广泛支持的一种,如bash(自由/开放),kash(非自由) .Bash ( B ourne a gain s hell)是Bourne shell的shell替代品 . 巴什是sh的超集 . Bash支持sh . POSIX是一组标准,用于定义POSIX兼容系统应如何工作 . Bash实际上不是POSIX兼容的shell . 在脚本语言中,我们将解释器表示为
#!/bin/bash
.Analogy:
Shell就像一个接口或规范或API .
sh是一个实现Shell接口的类 .
Bash是sh的子类 .
/bin/sh
可能会也可能不会调用与/bin/bash
相同的程序 .sh
至少支持required by POSIX功能(假设实现正确) . 它也可能支持扩展 .bash
,"Bourne Again Shell",实现了sh plus bash特定扩展所需的功能 . 完整的扩展集在这里描述的时间太长,并且随着新版本的不同而不同 . bash手册中记录了这些差异 . 输入info bash
并阅读"Bash Features"部分(当前版本中的第6部分),或阅读current documentation online .其他答案一般都指出了Bash和POSIX shell标准之间的区别 . 但是,在编写可移植的shell脚本并用于Bash语法时,一系列典型的bashisms和相应的纯POSIX解决方案非常方便 . 当Ubuntu从Bash切换到Dash作为默认系统shell时,已经编译了这样的列表,可以在这里找到:https://wiki.ubuntu.com/DashAsBinSh
此外,还有一个很棒的工具叫做checkbashisms,它可以检查脚本中的bashisms,并且当你想确保你的脚本是可移植的时候会很方便 .
发表于UNIX.COM
Shell features
下表列出了我认为可以让您选择一个shell而不是另一个shell的大多数功能 . 它不是一个明确的列表,并不包含每个可能的shell的每个可能的功能 . 如果在操作系统附带的版本中,或者如果可以直接从标准分发编译,则该功能仅被视为在shell中 . 特别是下面指定的C shell是SUNOS 4. *上提供的,现在相当多的供应商提供了tcsh或者他们自己的增强型C shell(他们并不总是明确表示他们正在发送tcsh .
Code:
Key to the table above.
Y功能可以使用此shell完成 .
外壳中不存在N功能 .
F功能只能通过使用shell功能机制来完成 .
L必须将readline库链接到shell以启用此功能 .
Notes to the table above