Logger im Shell-Skript verwenden

Logger im Shell-Skript verwenden

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/bashund es wird funktionieren.

Antwort3

Ich musste tatsächlich nachschauen, was die Zeile ntpd -qnp pool.ntp.org 2> >(logger)macht:

  1. Laufenntpd -qnp pool.ntp.org
  2. Leiten Sie seinen stderr um 2>nach ... wohin genau? Also...
  3. >(logger)
    1. Erstellt eine Named Pipe (sieheMechanismus), nennen/dev/fd/pipe100
    2. Startet den Prozess logger, indem er seine STDIN aus dieser Pipe liest
    3. Ersetzt den Namen /dev/fd/pipe100im Befehl
  4. ...und so läuftntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. ... während der Prozess loggeraus 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.

verwandte Informationen