Gibt es einen sh
Code, der keinen syntaktisch gültigen Bash-Code enthält (wird die Syntax nicht außer Kraft gesetzt)?
Ich überlege, sh
mit bash
bestimmten Befehlen zu überschreiben .
bash
shell-script
posix
Alexander Mills
quelle
quelle
((
kommt mir zB in den Sinn./usr/bin/sh
ist es nur ein Sym-Link zu/usr/bin/bash
(ich verwende CentOS 7.3 und es ist). Sie sollten überprüfen, obsh
es wirklichbash
für Ihre Distribution ist.#!/bin/sh
nach ändern#!/bin/bash
. Dann hat alles wieder geklappt, also muss man wirklich vorsichtig sein. Es kann vorgekommen sein, als sie angefangen haben, dash anstelle von bash für sh zu verwenden.Antworten:
Hier ist ein Code, der in POSIX sh und Bash etwas anderes macht :
Ob das für dich "ungültig" ist, weiß ich nicht.
In Bash werden sowohl die Standardausgabe als auch der Standardfehler von
hello
in die Datei umgeleitetworld
. In POSIXsh
wird eshello
im Hintergrund ausgeführt und führt dann eine leere Umleitung durchworld
, wobei es abgeschnitten wird (dh, es wird wie folgt behandelt& >
).Es gibt viele andere Fälle, in denen Bash-Erweiterungen ihre Sache machen, wenn sie unter laufen
bash
, und in einem reinen POSIX unterschiedliche Effekte haben würdensh
. Zum Beispiel ist die Klammererweiterung eine andere und funktioniert auch im POSIX-Modus von Bash genauso und nicht.Was statische Syntaxfehler betrifft, hat Bash sowohl reservierte Wörter (wie
[[
undtime
), die nicht von POSIX angegeben wurden, dh[[ x
gültigen POSIX-Shell-Code, aber einen Bash-Syntaxfehler, als auch eine Historie verschiedener POSIX-Inkompatibilitätsfehler, die zu Syntaxfehlern führen können. wie der aus dieser Frage :Syntax-Errors-only ist eine ziemlich gefährliche Definition von "ungültig" für alle Umstände, bei denen es darauf ankommt, aber es gibt sie.
quelle
{fd}>file
ein ähnliches Problem) zu ermöglichen, sodass bash wieder konform sein kann (Klammererweiterung) bleiben würde nicht spezifiziert, aber kompatible Skripte würde tun müssen ,echo "{a,b}"
ist sie wollen{a,b}
ausgegeben werden). Siehe Diskussion, die es gestartet hat/bin/sh
bash ist. Wenn ich mir dieses Bashismus nicht bewusst wäre und eine Befehlszeile schreibe, könnte dies leicht passieren. Der Abstand in der Antwort macht es unwahrscheinlich, ist aberhello&>world
weniger weit hergeholt.&>
Unterschied im letzten Monat zurückzuführen ist!Ein kurzes Beispiel:
time
in Bash ist ein reserviertes Wort und verhält sich anders als dastime
Programm. Es ist sehr wahrscheinlich, dass Sie einige praktische Skripte abbrechen, um das Ergebnistime
mit bash zu analysieren . Aber technisch ist es kein Syntaxfehler. Eine Neudefinitiontime
als Funktion ist selten, führt jedoch zu einem Syntaxfehler, wie in dieser Frage angegeben.Ein kürzeres Beispiel:
Gültig in
dash
, aber nicht POSIX-konform.quelle
time
gibt es Sachen wiedeclare
,function
,select
, undcoproc
. Einige davon sind zwar im Standard explizit als nicht spezifiziert markiert ( Schlüsselwörter und integrierte Programme / Dienstprogramme ), aber ich kann zBtime
odercoproc
in der Liste nicht sehen . Und die Verwendung--posix
scheint nicht zu helfen.