为什么在使用sh和bash时会得到不同的输出?


8

我有以下简单的脚本:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

如果我运行时输出sh file.sh

Bash version ...
{1..99..2}

如果我运行时输出bash file.sh

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

我有两个查询:

  1. 如果我写了一个指定shell的shabang行,那么无论我使用sh file.sh还是,它都不应与bash一起运行bash file.sh

  2. 我知道$BASH_VERSIONsh无法识别,但是for循环有什么问题?为什么不打印数字?

Answers:


16

sh,伯恩贝壳,很。它的行为由POSIX标准指定。如果您想要新的行为,可以使用bash,Bourne Again shell,它会一直添加新功能。在许多系统上,shjust是bash,并bash在以该名称运行时打开兼容模式。在Ubuntu上shdashDebian Almquist shell。

支撑扩展是一个相对较新的功能,在较旧的基础上也将不可用。当然不应该进入sh

仅当您将脚本作为可执行文件调用时,才遵守shebang行:

./myscript.sh

我可以给出一个脚本,但仍然可以通过运行以下命令在Python中打开它:

python myscript.sh

在Unix和Linux上查看以下出色的问题:


5

SH是愚蠢的。它无能为力。

它只知道最基本的命令。它没有做任何其他事情。

它无法将{1..99}理解为数值。它将其理解为字符串。

SH / Dash未开发。它旨在作为DIRE情况下的紧急提示(在交互模式下。否则,对于脚本编写来说确实是一件好事。)。

建议使用Bash,因为它可以完成SH所能做的所有事情,以及最新的自定义功能和强大功能。

在回答#1时,#!仅当直接调用程序时才解析。(如./program.sh


6
正如您在Ubuntu中提供的那样,“ 它的意思是在DIRE情况下发出紧急提示。 ” 主要是在“在DIRE情况下发出紧急提示”时不出现,而是使系统可以运行并快速启动。通过这种方式,非常适合于使用在一个现代化的操作系统,但什么它非常适合作为一个低调,快速外壳的脚本-尤其是运行系统的脚本,同时启动一个大的,复杂的,现代的操作系统,以最小性能开销。dashshdash
伊利亚·卡根

@EliahKagan如果出现严重错误,您实际上仅使用SH。
卡兹·沃尔夫

1
sh在Ubuntu引导过程中,您会经常使用,特别是频繁使用。对于自动化脚本的使用而言,这主要很重要,而这在Ubuntu中非常重要。(如果你要删除/bin/sh符号链接-这样,实际上,就不会有“无SH” -事情会去可怕的错误:Ubuntu的不能启动到一个可用的状态。)
利雅卡根

@EliahKagan上次使用SH作为首选终端是什么时候?我知道您使用它来编写脚本,但是何时真正在交互模式下使用它呢?
卡兹·沃尔夫

2
昨天,检查命令的可移植性。但是您很少使用破折号的交互式用法是正确的。(无论如何,我的交互式使用的上下文仍然是面向脚本的。)……但是,“使用”并不意味着“交互式使用”,更重要的是,此问题中的用例不是交互式的!
伊利亚·卡根
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.