Warum bekomme ich bei sh und bash unterschiedliche Ausgaben?

8

Ich habe das folgende einfache Skript:

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

Ausgabe für den Fall, dass ich laufe mit sh file.sh:

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

Ausgabe für den Fall, dass ich laufe mit bash file.sh:

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

Ich habe zwei Fragen:

  1. Wenn ich eine Shabang-Zeile geschrieben habe, die eine Shell angibt, sollte sie dann nicht mit Bash ausgeführt werden, unabhängig davon, ob ich sh file.shoder verwende bash file.sh?

  2. Ich verstehe, dass $BASH_VERSIONdies von sh nicht erkannt wird, aber was ist das Problem mit der for-Schleife? Warum werden die Zahlen nicht gedruckt?

Rishiag
quelle

Antworten:

16

sh, die Bourne-Muschel, ist alt . Sein Verhalten wird durch den POSIX-Standard festgelegt . Wenn Sie ein neues Verhalten wünschen, verwenden Sie bashdie Bourne Again-Shell, der ständig neue Funktionen hinzugefügt werden. Auf vielen Systemen shist dies gerecht bashund bashaktiviert einen Kompatibilitätsmodus, wenn es unter diesem Namen ausgeführt wird. Unter Ubuntu shist dashdie Debian Almquist-Shell.

Die Klammererweiterung ist eine relativ neue Funktion und wäre auch in älteren Bashes nicht verfügbar. Es sollte auf keinen Fall drin sein sh.

Die Shebang-Zeile wird nur respektiert, wenn Sie das Skript als ausführbare Datei aufrufen:

./myscript.sh

Ich kann einem Skript jeden Shebang geben und es trotzdem in Python öffnen, indem ich Folgendes ausführe:

python myscript.sh

Sehen Sie sich diese hervorragenden Fragen zu Unix und Linux an:

muru
quelle
5

SH ist dumm. Es kann nichts machen.

Es kennt nur die grundlegendsten Befehle. Es macht nichts anderes.

Es kann {1..99} nicht als numerischen Wert verstehen. Es versteht es als Zeichenfolge.

SH / Dash ist nicht entwickelt. Es soll eine Notfallaufforderung für DIRE-Umstände sein (im interaktiven Modus. Andernfalls ist es eine wirklich gute Sache für die Skripterstellung.).

Bash wird empfohlen, da es alles kann, was SH kann, sowie die neuesten Anpassungen und leistungsstarken Funktionen.

In Antwort auf # 1 wird das #!nur analysiert, wenn das Programm direkt aufgerufen wird. (wie in ./program.sh)

Kaz Wolfe
quelle
6
" Es soll eine Notfallaufforderung für DIRE-Umstände sein. " dash, Wie Sie shin Ubuntu sagen , ist nicht hauptsächlich "eine Notfallaufforderung für DIRE-Umstände" vorhanden, sondern das System kann schnell ausgeführt und gestartet werden . Auf diese Weise dashwird auch auf dem Einsatz in einem modernen Betriebssystem geeignet, aber was es ist gut geeignet für ist als Low-Profile, schnell Shell für Scripting - insbesondere System - Skripte läuft , während ein großen, komplexe, moderne OS bootet, mit minimalem Leistungsaufwand.
Eliah Kagan
@EliahKagan Du benutzt SH wirklich nur, wenn etwas furchtbar falsch ist.
Kaz Wolfe
1
Sie verwenden shziemlich ständig und besonders intensiv als Ubuntu-Stiefel. Es ist hauptsächlich wichtig für die Verwendung von automatisierten Skripten, und das ist ein sehr wichtiger Anwendungsfall in Ubuntu. (Wenn Sie den Symlink entfernen würden/bin/sh - so dass es tatsächlich "kein SH" geben würde - würden die Dinge furchtbar schief gehen: Ubuntu konnte nicht in einen verwendbaren Zustand
hochfahren
@EliahKagan Wann haben Sie SH zuletzt als bevorzugtes Terminal verwendet? Ich weiß, dass Sie es zum Schreiben von Skripten verwenden, aber wann verwenden Sie es tatsächlich im interaktiven Modus?
Kaz Wolfe
2
Gestern, um zu überprüfen, wie portabel ein Befehl war. Ihr Standpunkt, dass die interaktive Verwendung von Dash selten ist, ist jedoch gültig. (Und überhaupt, der Kontext meiner interaktiven Verwendung war immer noch skriptorientiert.) .... Aber "Verwendung" bedeutet nicht "interaktive Verwendung", und was noch wichtiger ist, der Anwendungsfall in dieser Frage ist kein interaktiver!
Eliah Kagan