Wenn ich im SSH-Terminal für CentOS den folgenden Code verwende, funktioniert das einwandfrei:
paste <(printf "%s\n" "TOP")
Wenn ich jedoch denselben Zeilencode in ein Shell-Skript (test.sh) einfüge und das Shell-Skript vom Terminal aus starte, wird ein Fehler ausgegeben
./test.sh: line 30: syntax error near unexpected token ('
./test.sh: line 30: paste <(printf "%s\n" "TOP")
Wie kann ich dieses Problem beheben?
dash
anstelle vonbash
).#!/bin/sh
an der Spitze. Ich habe als ausgeführt,bash test.sh
aber es hat auch nicht funktioniert.bash
im POSIX-Modus wird diese Syntax auch nicht unterstützt (wenn mit--posix
oder als aufgerufen/bin/sh
). Verwenden Sie#!/bin/bash
.POSIXLY_CORRECT
beim Start eine Variable gesetztbash
?#!/bin/bash
oben zu wechseln hat das Problem behoben.Antworten:
Prozess Substitution nicht durch POSIX spezifiziert, so dass nicht alle POSIX - Shell sie unterstützen nur einige Schalen wie
bash
,zsh
,ksh88
,ksh93
Unterstützung.Im
Centos
System/bin/sh
ist symlink zu/bin/bash
. Wennbash
mit dem Namen aufgerufen wirdsh
, wird derbash
Posix-Modus aufgerufen ( Bash- Startdateien - Mit dem Namen sh aufgerufen ). Wird im Posix-Modusprocess substitution
nicht unterstützt, verursacht dies einen Syntaxfehler.Skript sollte funktionieren, wenn Sie
bash
direkt anrufenbash test.sh
. Wenn nicht, ist möglicherweisebash
der Posix-Modus aktiviert. Dies kann auftreten, wenn Siebash
mit einem--posix
Argument beginnen oderPOSIXLY_CORRECT
wenn beimbash
Start eine Variable festgelegt wird :Oder
bash
ist mit--enable-strict-posix-default
Option gebaut.Hier brauchen Sie keine Prozessersetzung, Sie können Standard-Mantelrohre verwenden:
-
paste
Dies ist die Standardmethode zum Lesen der Daten von stdin. Bei einigenpaste
Implementierungen können Sie darauf verzichten, obwohl dies nicht Standard ist.Wo es nützlich wäre, ist das Einfügen der Ausgabe von mehr als einem Befehl wie in:
Auf Systemen, die dies unterstützen
/dev/fd/n
, kann Folgendes ausgeführtsh
werden:(es ist was
<(...)
intern macht).quelle
Hier ist eine weitere Problemumgehung. Anstatt den Befehl auszuführen, führen Sie bash aus und übergeben Sie den Befehl mit -c an bash:
quelle