In Bash können Sie alle zukünftigen Standardausgaben des aktuell ausgeführten Skripts umleiten . Zum Beispiel mit diesem Skript,
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
Dies wird in Syslog enden:
Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3
Dies ist jedoch Bash-spezifisch und der nackte Manager mit Umleitung scheint in Dash nicht zu funktionieren.
Syntax error: redirection unexpected
Wie kann ich dafür sorgen, dass es in Dash oder möglicherweise in beiden Shells funktioniert?
>
in Bindestrich umleiten . Mir ist klar, dass Sie anscheinend nach etwas anderem fragen, aber ich kann nicht genau sagen, was es ist.Antworten:
Sie können einfach tun:
Sie können das mit jeder Shell tun.
Wenn Ihnen das Aussehen nicht gefällt, lassen Sie das Skript möglicherweise selbst in eine Funktion einschließen.
quelle
run ${1+"$@"} || do stuff
so sein, dass die Argumente beibehalten werden.${1+"$@"}
macht nichts"$@"
nicht. Es hatte sowieso andere Probleme."$@"
wird übergeben,""
wenn keine Argumente vorhanden sind, während${1+"$@"}
eine leere Zeichenfolge übergeben wird, wenn keine Argumente vorhanden sind. Dies ist für viele Programme von enormer Bedeutung, da sie""
als leeres Argument analysiert werden, während eine (nicht zitierte) leere Zeichenfolge überhaupt nicht als Argument interpretiert wird.dash
auf einem solchen System zu finden ) , ist aber ansonsten"$@"
insofern einzigartig, als ein Null-Argument-Fall kein Null-Argument für POSIX-Shells ersetzt."${@+is especially cool $@}"
. Aber praktisch nicht ganz anders als die alte${1+”$@"}
Problemumgehung. Wenn Sie ein ksh93 haben:"${1+quoted" not quoted "quoted again}"
Die Prozesssubstitution lässt sich leicht mit Named Pipes simulieren.
In der Tat sind Named Pipes einer der Mechanismen (der andere ist
/dev/fd
), mit denen die Prozesssubstitution implementiert werden kannbash
.quelle
Ich denke nicht, dass dies in möglich ist
dash
. Soweit ich auf seinerman
Seite sehen kann , wird die Prozessersetzung nicht unterstützt.Um dieses Problem zu umgehen , können Sie versuchen, was mikserv vorgeschlagen hat , oder Sie können alles in eine Datei umleiten und dann nach Abschluss Ihres Skripts (vermutlich in einem Skript) den Inhalt dieser Datei zum Logger hinzufügen:
quelle
dash
anderen Shells einfacher . Die Prozessersetzung ist nur ein Argument, das auf eine/dev/fd/[num]
Verknüpfung zu einer anonymen Pipe verweist .dash
Hier werden Dokumente mit anonymen Pipes erstellt, anstatt wie bei den meisten anderen Shells temporäre Dateien zu erstellen. Istcat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
also nicht nur funktional gleichwertig, Sie können den fd sogar selbst benennen. Trotzdem ist es gut gemacht, in die andere Richtung zu gehen - Sie müssen eine neue fd mitexec
einem Prozess öffnen und einen Hintergrund erstellen, der sie liest.cat /dev/fd/3 3<<HEREDOC\n$(get output)\nHEREDOC\n
"einfacher" alscat <(get output)
?< >
Shell-Umleitungen. Wenn Sie nur zwei davon ausführen, können Sie im Grunde auch die folgenden Zeilen stapeln. Aber ja, Sie haben einen Punkt - ich mag hier Dokumente. Trotzdem, so viele Dinge, an die man sich erinnern muss, ist es einfacher, wenn sie universell funktionieren, denke ich. Andererseits haben viele Leute nicht viel Verwendung für andere Muscheln und so macht es für sie keinen Unterschied. Ich bin einfach nicht unter ihnen./dev/fd/3
(in dieser genauen Form) und die Details darüber, was mit Leerzeichen passiert. . . Die Tatsache, dass dieser gesamte Ansatz in Dash überhaupt funktioniert, wenn er in anderen Shells mit allen Komponenten nicht funktioniert, bedeutet, dass der Gesamtansatz eine besondere Regel ist, an die man sich erinnern sollte. (Dies erinnert mich an Versuche, ein vereinfachtes Englisch mit weniger Vokabeln zu erstellen; sie schneiden Wörter wie persist aus , ignorieren aber ebenso schwierige Redewendungen wie keep on .)