当前位置: 首页>>技术问答>>正文


#!/bin/sh和#!/bin/bash有什么区别?

, , , ,

问题描述

如果我写,

#!/bin/bash
echo "foo"

要么

#!/bin/sh
echo "foo"

两者产量相同。我看过一些以#!/bin/sh#!/bin/bash开头的脚本。他们之间有什么区别吗?

最佳解决方案

bashsh是两种不同的壳。基本上bashsh,具有更多功能和更好的语法。大多数命令的工作原理是相同的,但它们不同。

话虽如此,你应该认识到在大多数系统上/bin/sh将是一个符号链接,并且不会调用sh。在Ubuntu /bin/sh中,用于链接到bash,这是Linux发行版的典型行为,但现在已更改为链接到another shell called dash。我会使用bash,因为这几乎是标准(或者至少从我的经验来看最常见)。事实上,当bash脚本使用#!/bin/sh时会出现问题,因为script-maker假定链接是bash,而不是必须的。

欲了解更多信息,http://man.cx/shhttp://man.cx/bash

次佳解决方案

在Linux和其他Unix-like系统上,您可以选择多个shell。

shell不仅负责绘制你的小提示,还负责解释你的命令,特别是当你输入复杂的逻辑如管道,条件等时。

bash是用于Linux系统用户的最常用shell。它是整个Unix历史中使用的其他shell的精神后代。它的名字bash是Bourne-Again Shell的缩写,它是对Bourne shell的设计替代品,尽管它也包含了C Shell和Korn Shell的特性。

它现在从/bin/bash运行,任何带有bash的系统都可以在这里访问它。

不过,这不仅仅是使用shell的用户。脚本(shell脚本)需要shell来解释它们。当你运行一个shell脚本时,你的系统需要启动一个shell进程来执行你的脚本。

问题是,不同的shell之间有很小的不一致,当涉及到运行脚本时,这可能是一个真正的问题。 bash有相当多的脚本功能,这些功能只对bash有用,对其他shell不是。这很好,如果你总是使用bash来运行这些脚本。其他shell可能试图模拟bash,或者遵守POSIX标准,bash支持的很好(虽然增加了自己的扩展)。

可以在shell脚本的顶部指定应该使用shebang运行的shell。脚本可以在第一行指定#!/bin/bash,这意味着脚本应该始终使用bash而不是另一个shell来运行。

/bin /sh是一个代表系统shell的可执行文件。实际上,它通常作为指向可执行文件的符号链接实现,无论哪个shell是系统shell。系统shell是系统脚本应该使用的默认shell。在Linux发行版中,很长一段时间这通常是bash的符号链接,以至于总是将/bin /sh链接到bash或bash-compatible shell 已成为一种惯例。然而,在过去的几年里,Debian(和Ubuntu)决定将系统shell从bash切换到dash – 这是一个类似的shell – 在Linux中使用bash for /bin /sh的Linux传统(以及GNU)。 Dash被认为是更轻,更快的 shell ,可以有利于启动速度(以及需要大量shell脚本的其他内容,如软件包安装脚本)。

Dash与bash完全兼容,基于相同的POSIX标准。但是,它不实现bash-specific扩展。现有的脚本使用#!/bin/sh(系统shell)作为它们的shebang,但需要bash-specific扩展。目前这被认为是一个应该由Debian和Ubuntu修复的bug,它们需要/bin /sh才能在指向短划线时工作。

尽管Ubuntu的系统shell指向破折号,但作为用户的登录shell仍然会在这个时候出现。也就是说,当你在Linux的任何地方登录到终端仿真器时,登录shell将会是bash。当交互式使用shell并且用户熟悉bash(并且在其主目录中可能具有bash-specific自定义)时,操作速度并不是什么问题。

编写脚本时应该使用什么

如果您的脚本需要仅受bash支持的功能,请使用#!/bin/bash

但是,如果可能的话,最好确保脚本是POSIX-compatible,并且在任何安装中使用#!/bin/sh,它应该总是非常可靠地指向首选的POSIX-compatible系统shell。

第三种解决方案

除了以前的答案,即使/bin/sh是与/bin/bash的符号链接,#!/bin/sh也不完全等同于#!/bin/bash

bash(1) man page

“If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.”

例如bash特定语法:

 exec  > >(tee logfile.txt)

在从#!/bin/sh开始的shell中出现错误,即使使用sh-> bash符号链接。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/217.html,未经允许,请勿转载。