bash脚本与shell脚本相同吗?


58

我对Ubuntu非常陌生。我听到有人说“ shell脚本”,“ bash脚本”。

我不知道他们是不是一样?还是他们不同?


Answers:


55

Bash(bash)是许多可用的(至今仍是最常用的)Unix shell之一。击代表“ ourne 增益SH ELL”,并且是替代/改进原始Bourne Shell的(sh)。

Shell脚本是在任何 Shell中编写脚本,而Bash脚本是专门为Bash编写脚本。但是,实际上,除非有问题的shell不是Bash,否则“ shell脚本”和“ bash脚本”通常可以互换使用。

编辑:实际上,Ubuntu中的默认脚本外壳是破折号,而默认的交互式外壳(如果拉起终端会得到什么)是Bash。尽管如此,这两个术语仍然大部分可以互换。


1
什么将破折号定义为默认脚本外壳?
wjandrea

1
@wjandrea /bin/sh是符号链接的事实/bin/dash使它成为默认的系统外壳,但不是默认的脚本外壳,即没有绝对必须使用的书面规则/bin/sh。使用/bin/sh该脚本主要是出于可移植性的原因,当您希望将脚本用于多个类似Unix的OS平台时,其中大多数具有/bin/shPOSIX兼容的Bourne系列外壳。
Sergiy Kolodyazhnyy

29

介绍

Shell脚本和Bash脚本编制不是一回事,因为存在其他sh可用于执行脚本的外壳程序。打算由其执行BashBash脚本应标记为脚本。这些术语经常互换使用,因为Bash与相比,它具有扩展的功能sh,是在许多发行版中最常用于执行用户脚本的一种。不过,也有其他的壳,如Korn (ksh)C shell (csh)Z shell (zsh),但我们不会去到他们这里的讨论shbash最相关的Ubuntu Linux系统。一个伟大的IBM文章此处进入更多细节上的贝壳在Linux的发展和介绍以及外壳架构,以及如何炮弹有所不同。

Shell脚本

Sh是Stephen Bourne开发的原始Unix shell;但是基于Debian的系统和Ubuntu都将dash其视为sh外壳程序(sh实际上是与链接的dash)。在Debian和Ubuntu中,由于的速度sh,它更经常用于关键的系统过程和启动时执行关键脚本。有关更多详细信息,请参见Ubuntu WikiBash代表Bourne Again SHell,由Brian Fox后来开发,并大大扩展了原始版本sh。Fox和其他人的开发Bash是GNU项目的重要组成部分。见这个历史的大讨论Bash以获取更多信息。

需要注意的是这两个重要的是shBash,如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的WikiBash黑客和Steve Parker的最近一本关于Shell脚本的书,该书主要关注BashO'Reilly并由O'Reilly出版。《Bash初学者指南》也对它进行了很好的介绍。


2
这个答案实际上比我的答案(公认的答案)要好,我的答案刚好比这个答案早一周。
希尔顿汉姆威酒店15/12/17

4

有许多可用于Ubuntu的,像炮弹多bashzshkshtcshcsh

因此,无论何时有人说shell,他都在谈论其中之一。但是,这些外壳彼此有点不同。因此,当某人谈论bash脚本时,他正在使用shell,但是当某人谈论shell脚本时,他本身并没有使用bash。但是,正如bash在Ubuntu脚本编写中通常使用的那样,他通常是这样。而且,不同的外壳在很多方面都是相同的,因此通常无关紧要。


2
$ 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”的很大的超集。

在这里阅读更多:


2

Shell脚本将被定义为面向可移植性的脚本,可以由POSIX兼容OS 的系统Shell运行。语法与POSIX标准定义的Shell脚本语言语法相同或相似。这是大多数POSIX兼容操作系统(例如Linux / Unix / * BSD等)的标准。POSIX是跨操作系统兼容性的最常见基础。

与上述不同的操作系统为非交互使用(即执行系统脚本或使用#! /bin/shshebang的脚本)实现了不同的外壳,这些外壳除了实现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

Shebang说明符和类Unix操作系统上shell可执行文件的统一路径

由于为外壳放置可执行文件的统一规则(它们通常位于“ / bin /”目录中),我们可以为创建外壳脚本提供统一的规则,更具体地说,我们很清楚将shebang表达式中的路径指向何处适当的Shell可执行文件以运行脚本。Unix / Linux / * BSD文件系统本质上不支持扩展名,因此文件扩展名仅用作附加提示或用于索引。

特别bin/shbin/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脚本应进行哪些更改:

https://www.shellcheck.net/

http://mywiki.wooledge.org/Bashism


1
不错的答案,+ 1。欢迎来到AskUbuntu!
Sergiy Kolodyazhnyy

1
关于短跑如/ bin / sh的 ubuntu上,有针对您可能还需要引用的文章。还有askubuntu.com/q/976485/295286
Sergiy Kolodyazhnyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.