![Logger im Shell-Skript verwenden](https://rvso.com/image/623627/Logger%20im%20Shell-Skript%20verwenden.png)
Wie kann ich Logger in einem Shell-Skript verwenden?
Wenn ich renne
ntpd -qnp pool.ntp.org 2> >(logger)
In der Konsole funktioniert es wie erwartet.
Wenn ich es in ein Shell-Skript einfüge
#!/bin/sh
ntpd -qnp pool.ntp.org 2> >(logger)
Ich erhalte folgenden Fehler:
line 2: syntax error: unexpected redirection
exited with code 2
Was ist im Shell-Skript falsch?
Antwort1
Der Shebang ist korrekt, da sowohl #!/bin/sh als auch #!/bin/bash verwendet werden können*. Soweit ich mich erinnere, sollten Sie für den Logger jedoch Pipes und keine Umleitungen verwenden, da es sich um ein Programm und nicht um eine Datei handelt.
Versuchen Sie dieses Skript:
#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger
*Wenn Sie #!/bin/sh für Ihre Skripte verwenden, sollten diese POSIX-kompatibel sein, d. h. unter Solaris und AIX gut laufen. Wenn Sie jemals einige Bash-spezifische Funktionen verwenden, müssen Sie #!/bin/bash verwenden, da keine Portabilität mehr besteht.
Antwort2
Das Problem ist, dass Sie Bashismen verwenden, während Ihr Hash-Bang sagt /bin/sh
: . Ändern Sie es in #! /bin/bash
und es wird funktionieren.
Antwort3
Ich musste tatsächlich nachschauen, was die Zeile ntpd -qnp pool.ntp.org 2> >(logger)
macht:
- Laufen
ntpd -qnp pool.ntp.org
- Leiten Sie seinen stderr um
2>
nach ... wohin genau? Also... >(logger)
- Erstellt eine Named Pipe (sieheMechanismus), nennen
/dev/fd/pipe100
- Startet den Prozess
logger
, indem er seine STDIN aus dieser Pipe liest - Ersetzt den Namen
/dev/fd/pipe100
im Befehl
- Erstellt eine Named Pipe (sieheMechanismus), nennen
- ...und so läuft
ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
- ... während der Prozess
logger
aus dieser Pipe liest:logger < /dev/fd/pipe100
Das oben genannte sollte in Bash gut funktionieren.
Ich habe jedoch versucht, es explizit mit „sh“ auszuführen, was Folgendes ergibt:
script.sh: line 3: syntax error near unexpected token `>'
Wie die anderen Kommentatoren angemerkt haben, verwenden Sie hier wahrscheinlich nicht die Bash.
Tatsächlich verwendet Busybox dieAlmquist-Muschelstandardmäßig.
Antwort4
Höchstwahrscheinlich verwenden Sie mit /bin/sh eine andere Shell als Ihre Standard-Shell (wahrscheinlich Bash).
Um dies zu überprüfen, versuchen Sie, das Skript mit /bin/sh ./yourscript auszuführen oder fügen Sie dieselbe Shell wie $SHELL in Ihr Skript ein.
Welche Shell für /bin/sh verwendet wird, hängt wahrscheinlich von der Distribution ab und wenn Sie Solaris verwenden, sieht die Sache völlig anders aus.