Answers:
Bash(bash
)是许多可用的(至今仍是最常用的)Unix shell之一。击代表“ 乙 ourne 甲增益SH ELL”,并且是替代/改进原始Bourne Shell的(sh
)。
Shell脚本是在任何 Shell中编写脚本,而Bash脚本是专门为Bash编写脚本。但是,实际上,除非有问题的shell不是Bash,否则“ shell脚本”和“ bash脚本”通常可以互换使用。
编辑:实际上,Ubuntu中的默认脚本外壳是破折号,而默认的交互式外壳(如果拉起终端会得到什么)是Bash。尽管如此,这两个术语仍然大部分可以互换。
/bin/sh
是符号链接的事实/bin/dash
使它成为默认的系统外壳,但不是默认的脚本外壳,即没有绝对必须使用的书面规则/bin/sh
。使用/bin/sh
该脚本主要是出于可移植性的原因,当您希望将脚本用于多个类似Unix的OS平台时,其中大多数具有/bin/sh
POSIX兼容的Bourne系列外壳。
介绍
Shell脚本和Bash
脚本编制不是一回事,因为存在其他sh
可用于执行脚本的外壳程序。打算由其执行Bash
的Bash
脚本应标记为脚本。这些术语经常互换使用,因为Bash
与相比,它具有扩展的功能sh
,是在许多发行版中最常用于执行用户脚本的一种。不过,也有其他的壳,如Korn (ksh)
,C shell (csh)
和Z shell (zsh)
,但我们不会去到他们这里的讨论sh
和bash
最相关的Ubuntu Linux系统。一个伟大的IBM文章此处进入更多细节上的贝壳在Linux的发展和介绍以及外壳架构,以及如何炮弹有所不同。
Shell脚本
Sh
是Stephen Bourne开发的原始Unix shell;但是基于Debian的系统和Ubuntu都将dash
其视为sh
外壳程序(sh
实际上是与链接的dash
)。在Debian和Ubuntu中,由于的速度sh
,它更经常用于关键的系统过程和启动时执行关键脚本。有关更多详细信息,请参见Ubuntu Wiki。 Bash
代表Bourne Again SHell,由Brian Fox后来开发,并大大扩展了原始版本sh
。Fox和其他人的开发Bash
是GNU项目的重要组成部分。见这个历史的大讨论Bash
以获取更多信息。
需要注意的是这两个重要的是sh
和Bash
,如Ubuntu和其他发行版使用的是POSIX
兼容的,这意味着他们订阅了有关命令是如何在shell中执行一些标准。这是为了确保可以可靠地预测OS中使用的脚本的结果,并且可以将Shell的行为保持在这些POSIX
参数之内,因为这对于开发人员而言尤其重要。有关标准的更多信息,请参见官方文档。
.sh
尽管shell脚本旨在作为bash
脚本执行,但通常具有后缀,并且#!/bin/bash
在脚本的顶部。实际上,将脚本称为script.sh还是my.script并不重要,重要的是对解释器的调用是/bin/sh
还是/bin/bash
。也可以在命令行中使用sh
或调用Shell脚本bash
。
但是,请务必注意,根据调用的解释器的不同,结果可能会有所不同,因为并非所有bash
命令都可以在中运行sh
,而大多数sh
命令都可以在中运行bash
。通常,大多数用户都希望使用/bin/bash
其脚本,以便可以利用扩展功能集;/bin/sh
如果需要,可以执行系统脚本。
Bash Shell脚本编写资源
有时很难在网上找到遵循良好实践并提供建议的有用资源,以使您可以创建有用的脚本。之后man bash
,一些最重要的资源是Greg的Wiki,Bash黑客和Steve Parker的最近一本关于Shell脚本的书,该书主要关注Bash
O'Reilly并由O'Reilly出版。《Bash初学者指南》也对它进行了很好的介绍。
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29 11:53 /bin/sh -> dash*
$ ls -l /bin/dash
-rwxr-xr-x 1 root root 109768 Mar 29 11:53 /bin/dash*
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 955024 Apr 3 08:58 /bin/bash*
这表明“ sh”是到“破折号”的符号链接,而/ bin / bash是Ubuntu上的默认交互shell,是一个可执行文件,其大小比/ bin / sh大9倍。
确实,“ man sh”(1590行)与“ man bash”(5459行)的对比表明,bash是传统“ sh”的很大的超集。
在这里阅读更多:
Shell脚本将被定义为面向可移植性的脚本,可以由POSIX兼容OS 的系统Shell运行。语法与POSIX标准定义的Shell脚本语言语法相同或相似。这是大多数POSIX兼容操作系统(例如Linux / Unix / * BSD等)的标准。POSIX是跨操作系统兼容性的最常见基础。
与上述不同的操作系统为非交互使用(即执行系统脚本或使用#! /bin/sh
shebang的脚本)实现了不同的外壳,这些外壳除了实现POSIX命令和语法外,还具有自己的扩展名,或者有可能被剥夺了一些不太有用的功能出于性能方面的考虑,但是POSIX基础允许针对不同POSIX兼容Oss设计的脚本具有很高的可移植性。
前面提到的大多数操作系统都有单独的交互式外壳,通常是功能齐全的bash。Bash在很大程度上符合POSIX,但也有大量的附加命令池,并支持不同的语法。使用--posix命令行选项启动Bash或在Bash运行时执行'set -o posix',将通过更改行为使其与POSIX指定的行为相匹配,从而使Bash更加符合POSIX标准,这是Bash默认的区域有所不同,请参阅:https : //www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html
由于为外壳放置可执行文件的统一规则(它们通常位于“ / bin /”目录中),我们可以为创建外壳脚本提供统一的规则,更具体地说,我们很清楚将shebang表达式中的路径指向何处适当的Shell可执行文件以运行脚本。Unix / Linux / * BSD文件系统本质上不支持扩展名,因此文件扩展名仅用作附加提示或用于索引。
特别bin/sh
是bin/dash
在Debian / Ubuntu上,是一个符号链接,指向它是dash shell的可执行文件。这使破折号成为系统外壳,估计比功能更强大的bash快4倍,大小约为1/10。来源:https : //unix.stackexchange.com/questions/148035/is-dash-or-some-other-shell-faster-than-bash
默认情况下,Debian / Ubuntu交互式终端是bash,在许多其他类似Unix的操作系统中,bash的路径也是统一的:/bin/bash
。
POSIX.1-2017标准:http : //pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html
如果POSIX未定义命令或选项,则不要首先将其放在
#! /bin/sh
脚本中。
要将脚本从bash转换为POSIX形式,您可能需要自动检查shell脚本中的错误,或者查看要使其与POSIX兼容的bash脚本应进行哪些更改: