Gibt es einen SH-Code, der keinen syntaktisch gültigen Bash-Code enthält?

31

Gibt es einen shCode, der keinen syntaktisch gültigen Bash-Code enthält (wird die Syntax nicht außer Kraft gesetzt)?

Ich überlege, shmit bashbestimmten Befehlen zu überschreiben .

Alexander Mills
quelle
1
Ich denke, mit gültig meine ich syntaktisch gültig, daher wird die Syntax nicht außer Kraft gesetzt
Alexander Mills
2
Anderes Tokenisieren? ((kommt mir zB in den Sinn.
ccorn
1
Für manche Distributionen /usr/bin/shist es nur ein Sym-Link zu /usr/bin/bash(ich verwende CentOS 7.3 und es ist). Sie sollten überprüfen, ob shes wirklich bashfür Ihre Distribution ist.
Centimane
1
Vor ein paar Jahren ging mein gesamtes Projekt kaputt, als etwas in Bash "aufgerüstet" wurde. Ich musste alle meine Shebang-Zeilen von #!/bin/shnach ä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.
Joe
1
@ Joe, das ist das Gegenteil von dem, was das OP verlangt - Sie hatten Bash-Code, der als SH-Code falsch beschriftet wurde, aber nicht. Das OP fragt, ob sie (tatsächlichen, nicht falsch beschrifteten) sh- Code haben können, der bricht, wenn er mit Bash ausgeführt wird, nicht, wenn sie Bash-Code haben können, der bricht, wenn er mit Sh ausgeführt wird (was offensichtlich ist - wenn die Bash-Erweiterungen dies nicht taten) Auswirkungen auf die verfügbaren Sprachfunktionen haben, es wären keine Erweiterungen.
Charles Duffy

Antworten:

49

Hier ist ein Code, der in POSIX sh und Bash etwas anderes macht :

hello &> world

Ob das für dich "ungültig" ist, weiß ich nicht.

In Bash werden sowohl die Standardausgabe als auch der Standardfehler von helloin die Datei umgeleitetworld . In POSIX shwird es helloim Hintergrund ausgeführt und führt dann eine leere Umleitung durch world, 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ürden sh. 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 [[und time), die nicht von POSIX angegeben wurden, dh [[ xgü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 :

x=$(cat <<'EOF'
`
EOF
)
bash: line 2: unexpected EOF while looking for matching ``'
bash: line 5: syntax error: unexpected end of file

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.

Michael Homer
quelle
3
Beachten Sie, dass POSIX zwar derzeit die Kompatibilität von bash (und zsh, pdksh, ksh93) mit der Klammererweiterung herstellt, jedoch zusätzliche Vorkehrungen in der Spezifikation trifft, um die Klammererweiterung (und {fd}>fileein ä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
Stéphane Chazelas
2
Ebenfalls relevant für dieses Q & A: austingroupbugs.net/view.php?id=1191#c3983
Stéphane Chazelas
2
Würde jemand, der ein Skript in POSIX schreibt, jemals einen solchen Befehl schreiben? Das OP geht von sh zu bash, und meines Wissens scheint dies eher ein Problem in die andere Richtung zu sein?
Rich
1
@ Rich: Sicher. Ich verwende keine Systeme, in denen /bin/shbash 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 aber hello&>worldweniger weit hergeholt.
R ..
2
Ich habe tatsächlich einen Fehler gesehen, der auf den &>Unterschied im letzten Monat zurückzuführen ist!
Gordon Davisson
16

Ein kurzes Beispiel:

time()(:)

timein Bash ist ein reserviertes Wort und verhält sich anders als das timeProgramm. Es ist sehr wahrscheinlich, dass Sie einige praktische Skripte abbrechen, um das Ergebnis timemit bash zu analysieren . Aber technisch ist es kein Syntaxfehler. Eine Neudefinition timeals Funktion ist selten, führt jedoch zu einem Syntaxfehler, wie in dieser Frage angegeben.

Ein kürzeres Beispiel:

a():

Gültig in dash, aber nicht POSIX-konform.

user23013
quelle
3
Im Allgemeinen bewirkt jedes Wort, das ein nicht standardmäßiges Schlüsselwort oder ein in Bash integrierter Befehl ist, den gleichen Effekt. Neben timegibt es Sachen wie declare, function, select, und coproc. Einige davon sind zwar im Standard explizit als nicht spezifiziert markiert ( Schlüsselwörter und integrierte Programme / Dienstprogramme ), aber ich kann zB timeoder coprocin der Liste nicht sehen . Und die Verwendung --posixscheint nicht zu helfen.
ilkkachu