在编写shell程序时,我们经常使用/bin/sh和/bin/bash。我通常使用bash,但我不知道它们之间有什么区别。
Bash和sh的主要区别是什么?
用Bash和sh编程时,我们需要注意什么?
在编写shell程序时,我们经常使用/bin/sh和/bin/bash。我通常使用bash,但我不知道它们之间有什么区别。
Bash和sh的主要区别是什么?
用Bash和sh编程时,我们需要注意什么?
当前回答
其他答案通常指出了Bash和POSIX外壳标准之间的区别。然而,当编写可移植的shell脚本并习惯于Bash语法时,一系列典型的bashms和相应的纯POSIX解决方案非常方便。当Ubuntu从Bash切换到Dash作为默认系统外壳时,已经编译了这样的列表,可以在这里找到:https://wiki.ubuntu.com/DashAsBinSh
此外,还有一个名为checkbashms的伟大工具,它可以检查脚本中的bashms,并且在您希望确保脚本可移植时非常方便。
其他回答
什:http://man.cx/sh 猛击:http://man.cx/bash
TL;DR:Bash是sh的超集,具有更优雅的语法和更多的功能。在几乎所有情况下使用Bash-shebang线路都是安全的,因为它在现代平台上非常普遍。
注意:在某些环境中,sh就是Bash。检查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/bas)是:
现代Debian和Ubuntu系统,默认将sh符号链接到dash;Busybox,通常在Linux系统启动时作为initramfs的一部分运行。它使用ashshell实现。BSD系统以及一般的任何非Linux系统。OpenBSD使用pdksh,它是KornShell的后代。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 find都支持它。
Shebang线
最终,由您决定使用哪一行,将“shebang”行作为脚本的第一行。
E.g.
#!/bin/sh
将使用sh(以及所指向的任何内容),
#!/bin/bash
将使用/bin/bash(如果不可用,则会失败并显示错误消息)。当然,您也可以指定其他实现,例如。
#!/bin/dash
使用哪一个
对于我自己的脚本,我更喜欢sh,原因如下:
它是标准化的它更简单易学它在POSIX系统中是可移植的——即使它们碰巧没有bash,也需要有sh
使用bash也有好处。它的特性使编程更加方便,与其他现代编程语言的编程类似。其中包括作用域局部变量和数组。Plain sh是一种非常简约的编程语言。
其他答案通常指出了Bash和POSIX外壳标准之间的区别。然而,当编写可移植的shell脚本并习惯于Bash语法时,一系列典型的bashms和相应的纯POSIX解决方案非常方便。当Ubuntu从Bash切换到Dash作为默认系统外壳时,已经编译了这样的列表,可以在这里找到:https://wiki.ubuntu.com/DashAsBinSh
此外,还有一个名为checkbashms的伟大工具,它可以检查脚本中的bashms,并且在您希望确保脚本可移植时非常方便。
差异以最简单的方式解释:
在基本了解之后,其他答案将更容易理解。
Shell-“Shell”是一个程序,它促进了用户和操作系统(内核)之间的交互。有许多可用的shell实现,如sh、Bash、C shell、Z shell等。
使用任何shell程序,我们都可以执行该shell程序支持的命令。
巴什-它又一次源自伯恩-壳牌。使用这个程序,我们将能够执行shell指定的所有命令。此外,我们将能够执行一些专门添加到此程序中的命令。Bash与sh向后兼容。
Sh-源自伯恩壳牌。“sh”支持shell中指定的所有命令。这意味着,使用这个程序,我们将能够执行Shell指定的所有命令。
有关详细信息,请参阅:
猛冲猛击
终端
打开窗口的程序xterm、rxvt、konsole、kvt、gnome终端、nxtm和eterm。
外壳
是在终端中运行的程序Shell既是命令解释器也是编程语言Shell只是一个执行命令的宏处理器。宏处理器意味着可以扩展文本和符号以创建更大表达式的功能。
SH与BASH
SH
(SHell)是特定的外壳命令解释器和编程语言BASH的前身
BASH
(伯恩再次SHell)是特定的外壳命令解释器和编程语言具有sh功能等SH继任者BASH是默认的SHELL
参考材料:
外壳gnu.org网站:
在其基础上,shell只是一个执行命令。术语“宏处理器”是指文本和符号被展开以创建更大的表达式。Unix shell既是命令解释器,也是编程语言。作为命令解释器,shell为丰富的GNU实用程序集。编程语言功能允许这些实用程序将被合并。包含命令的文件可以是创建并成为命令本身。这些新命令具有与/bin等目录中的系统命令状态相同,允许用户或组可以建立自定义环境常见任务。壳可以交互或非交互使用。交互式模式下,它们接受从键盘键入的输入。执行时shell以非交互方式执行从文件读取的命令。shell允许同步执行GNU命令异步。shell等待同步命令完成在接受更多输入之前;异步命令继续执行与shell并行,同时它读取并执行其他命令。重定向构造允许对这些命令的输入和输出。此外,外壳允许控制命令环境的内容。外壳还提供一小组内置命令(内置命令)实现不可能或不方便通过独立的公用设施。例如,cd、break、continue和exec不能因为它们直接操纵外壳本身。历史、getopts、kill或pwd内置其他,可以在单独的实用程序中实现,但它们更多便于作为内置命令使用。所有的外壳都是如下文所述。虽然执行命令是必不可少的,但大多数功能(和复杂性)是由于它们的嵌入式编程语言。与任何高级语言一样,shell提供变量、流控件构造、引用和函数。外壳提供专门针对交互式使用的功能而不是扩充编程语言。这些交互功能包括作业控制、命令行编辑、命令历史记录和别名。本手册介绍了这些功能中的每一项。
BASH gnu.org网站:
Bash是GNU的shell或命令语言解释器操作系统。这个名字是“Bourne Again SHell”的首字母缩写,对斯蒂芬·伯恩(Stephen Bourne)的双关语当前的Unix shell sh,出现在第七版贝尔实验室Unix的研究版本。Bash在很大程度上与sh兼容,并包含有用的功能来自Korn shell ksh和C shell csh。它旨在成为IEEE POSIX Shell和Tools部分的一致实现IEEE POSIX规范(IEEE标准1003.1)对sh的交互和编程功能改进使用而GNU操作系统提供了其他shell,包括csh的版本,Bash是默认的shell。与其他GNU软件一样,Bash非常便携。它目前运行在几乎所有版本的Unix和其他一些操作系统-独立支持的端口适用于MS-DOS、OS/2和Windows平台。