Difference between sh and bash
在编写shell程序时,我们经常使用
在
什么是SH
因为
什么是bash
在开始做
bash的SH =?
很长一段时间,
在一些例子,系统
你如何能找到什么
这是
1 2 | % file -h /bin/sh /bin/sh: symbolic link to bash |
如果它是一个硬链接,尝试
1 2 3 | % find -L /bin -samefile /bin/sh /bin/sh /bin/bash |
事实上,无论是硬链接和符号链接
事情的经过线
最终,这是你决定哪一个使用,由写的吗?事情的经过吗?线。
例如
1 | #!/bin/sh |
要使用
1 | #!/bin/bash |
要使用它
1 | #!/bin/dash |
一个使用。
我喜欢自己的脚本,
- 它是标准化的
- 它是非常简单和容易的了解
- 在POSIX系统是便携式,即使他们有一
bash 困境,他们都要求有sh
有优势,利用
钛;
注:在某些环境下,
这个问题经常被指定为那些试图使用
首先,你应该理解期望的是什么。
- 如果使用
sh scriptname 运行脚本,或者使用scriptname 运行脚本,并且在shebang行中使用#!/bin/sh ,那么应该期望posixsh 行为。 - 如果使用
bash scriptname 运行脚本,或者使用scriptname 运行脚本,并在shebang行中使用#!/bin/bash 或本地等效的脚本,那么应该期望bash行为。
使用正确的shebang并只键入脚本名(可能带有相对路径或完整路径)来运行脚本通常是首选的解决方案。除了正确的shebang之外,这还要求脚本文件具有执行权限(
那么,它们到底有什么不同呢?
bash参考手册有一节试图列举差异,但一些常见的混淆源包括
[[ 在sh 中不可用(只有[ 更为笨重和有限)。sh 没有数组。- 有些bash关键字,如
local 、source 、function 和select ,不可移植到sh 。(一些sh 实现支持,如local ) - bash有许多C风格的语法扩展,如
$'string 和三参数
with\tC\aescapes'for((i=0;i<=3;i++)) 循环、+= 增量赋值等。 - bash支持
<<<'here strings' 。 - 巴什有
*.{png,jpg} 和{0..12} 两个支柱扩张。 ~ refered to$HOME only in bash(and more generally~username to the home directory ofusername 。this is in posix,but may be mising from some pre-posix/bin/sh implements.- bash与
<(cmd) 和>(cmd) 进行过程替换。 - bash有csh风格的方便重定向别名,如
2>&1 | 的&| ,> ... 2>&1 的&> 。 - bash支持与
<> 重定向的协处理。 - bash具有丰富的扩展非标准参数扩展集,如
${substring:1:2} 、${variable/pattern/replacement} 、case转换等。 - bash为shell算法(尽管仍然没有浮点支持)提供了显著的扩展功能。
- 许多、许多仅用于bash的扩展,用于启用或禁用可选行为并公开shell的内部状态。
- 许多,许多交互使用的便利功能,但不影响脚本行为。
记住,这是一个简短的清单。参考参考手册了解完整的独家新闻,http://mywiki.wooledge.org/bashism了解许多好的解决方法;和/或尝试http://shellcheck.net/,其中警告许多仅针对bash的功能。
一个常见的错误是使用
不幸的是,当bash作为
从unix.com发布
壳体特征
下表列出了我认为可以让您选择一个shell而不是另一个shell的大多数功能。它不打算是一个确定的列表,也不包括每个可能的shell的每个可能的特性。只有在操作系统附带的版本中,或者在直接从标准发行版编译的版本中,才认为某个功能在shell中。特别是,下面指定的C shell在Sunos4上可用。*现在有相当多的供应商提供TCSH或他们自己的增强C shell(他们并不总是明显地表明他们正在运送TCSH)。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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特性可以用这个外壳来完成。
n功能在外壳中不存在。
F功能只能通过使用shells函数来完成机制。
l必须将阅读线库链接到shell才能启用这个特点。
上表注释
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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. |
shell是用户和操作系统之间访问操作系统服务的接口。它可以是GUI或CLI(命令行界面)。
sh(bourne shell)是一个shell命令行解释器,用于类Unix/Unix操作系统。它提供了一些内置命令。在脚本语言中,我们将解释器表示为
bash(又称bourne shell)是bourne shell的shell替代品。bash是sh的超集。bash支持sh。posix是一组定义posix兼容系统应该如何工作的标准。bash实际上不是一个符合POSIX的shell。在脚本语言中,我们将解释器表示为
类比:
- shell类似于接口、规范或API。
- sh是实现shell接口的类。
- bash是sh的一个子类。
终端
- 打开窗口的程序
- xterm、rxvt、konsole、kvt、gnome终端、nxterm和eterm。
壳牌
- 是在终端中运行的程序
- shell既是命令解释程序又是编程语言
- shell只是一个执行命令的宏处理器。
- 宏处理器意味着扩展文本和符号以创建更大表达式的功能。
嘘嘘
嘘
- (壳牌)
- 是一个特定的外壳
- 命令解释程序和程序设计语言
- bash的前身
猛击
- (又是伯恩·壳牌)
- 是一个特定的外壳
- 命令解释程序和程序设计语言
- 具有sh功能等
- SH继承人
- bash是默认shell
参考材料:
壳牌GNU-ORG:
At its base, a shell is simply a macro processor that executes
commands. The term macro processor means functionality where text and
symbols are expanded to create larger expressions.A Unix shell is both a command interpreter and a programming language.
As a command interpreter, the shell provides the user interface to the
rich set of GNU utilities. The programming language features allow
these utilities to be combined. Files containing commands can be
created, and become commands themselves. These new commands have the
same status as system commands in directories such as /bin, allowing
users or groups to establish custom environments to automate their
common tasks.Shells may be used interactively or non-interactively. In interactive
mode, they accept input typed from the keyboard. When executing
non-interactively, shells execute commands read from a file.A shell allows execution of GNU commands, both synchronously and
asynchronously. The shell waits for synchronous commands to complete
before accepting more input; asynchronous commands continue to execute
in parallel with the shell while it reads and executes additional
commands. The redirection constructs permit fine-grained control of
the input and output of those commands. Moreover, the shell allows
control over the contents of commands’ environments.Shells also provide a small set of built-in commands (builtins)
implementing functionality impossible or inconvenient to obtain via
separate utilities. For example, cd, break, continue, and exec cannot
be implemented outside of the shell because they directly manipulate
the shell itself. The history, getopts, kill, or pwd builtins, among
others, could be implemented in separate utilities, but they are more
convenient to use as builtin commands. All of the shell builtins are
described in subsequent sections.While executing commands is essential, most of the power (and
complexity) of shells is due to their embedded programming languages.
Like any high-level language, the shell provides variables, flow
control constructs, quoting, and functions.Shells offer features geared specifically for interactive use rather
than to augment the programming language. These interactive features
include job control, command line editing, command history and
aliases. Each of these features is described in this manual.
Bash GNU-ORG:
Bash is the shell, or command language interpreter, for the GNU
operating system. The name is an acronym for the ‘Bourne-Again SHell’,
a pun on Stephen Bourne, the author of the direct ancestor of the
current Unix shell sh, which appeared in the Seventh Edition Bell Labs
Research version of Unix.Bash is largely compatible with sh and incorporates useful features
from the Korn shell ksh and the C shell csh. It is intended to be a
conformant implementation of the IEEE POSIX Shell and Tools portion of
the IEEE POSIX specification (IEEE Standard 1003.1). It offers
functional improvements over sh for both interactive and programming
use.While the GNU operating system provides other shells, including a
version of csh, Bash is the default shell. Like other GNU software,
Bash is quite portable. It currently runs on nearly every version of
Unix and a few other operating systems - independently-supported ports
exist for MS-DOS, OS/2, and Windows platforms.
其他答案通常指出了bash和posix shell标准之间的区别。然而,在编写可移植的shell脚本和用于bash语法时,一个典型的bashims列表和相应的纯posix解决方案非常方便。当Ubuntu从bash切换到dash作为默认系统shell时,已经编译了这样的列表,可以在这里找到:https://wiki.ubuntu.com/dashasbinsh
此外,还有一个名为checkbashims的伟大工具,它可以检查脚本中的bashims,并在需要确保脚本可移植时提供便利。
Linux操作系统提供不同类型的shell。虽然shell有许多共同的命令,但每种类型都有独特的特性。让我们来研究不同类型的常用贝壳。
SH壳牌:
sh shell也被称为bourne shell。SHshell是美国电话电报公司贝尔实验室的斯蒂芬·伯恩于1977年为Unix计算机开发的第一个shell。它包括许多脚本工具。
巴什贝壳:
bash shell再次代表bourne shell。bash shell是大多数Linux发行版中的默认shell,它可以替代sh shell(sh shell也将在bashshell中运行)。bash shell可以在不进行修改的情况下执行绝大多数sh shell脚本,还提供命令行编辑功能。