Syntaxfehler: Ungültige FD-Nummer?

Syntaxfehler: Ungültige FD-Nummer?

Meine Bewerbung:

#!/bin/sh

#
# D2GS
#

# Go to the directory
cd ~

# Run the applications
if ! ps aux | pgrep "D2GS"; then
    wine "C:/D2GS/D2GS.exe" >& /dev/null &
fi

Gibt einen Fehler aus:

./d2gs.sh: 14: ./d2gs.sh: Syntaxfehler: Ungültige fd-Nummer

Das ist seltsam, denn wenn ich es starte wine "C:/D2GS/D2GS.exe" >& /dev/null &, läuft es ohne Probleme. Der Grund, warum ich es von der Shell aus starten möchte, ist, dass ich es jede Minute in Crontab ausführen möchte.

Antwort1

>&wird von nicht unterstützt sh. Sie verwenden shin diesem Skript explizit als Shell. Sie müssen diese Zeile wie folgt umschreiben:

wine "C:/D2GS/D2GS.exe" > /dev/null 2>&1 &

Antwort2

>&ist dercshSyntax (auch unterstützt von zshund neueren Versionen von bash), um sowohl stdout als auch stderr in eine Datei umzuleiten.

In sh(Bourne (woher es kommt) und POSIX) lautet die Umleitungssyntax¹:

if ! pgrep D2GS > /dev/null; then 
  wine C:/D2GS/D2GS.exe > /dev/null 2>&1 &
fi

(Sie haben außerdem die falsche ps/pgrep-Syntax; pgrepliest die Standardeingabe nicht, daher psist es sinnlos, die Ausgabe dorthin weiterzuleiten).

Der Vollständigkeit halber die Syntax zum Umleiten von stdout und stderr in verschiedenen Shells:

  • > file 2>&1: Bourne, POSIX und Derivate und Fisch
  • >& file: csh, tcsh, zsh und bash 4+ (allerdings zshnur bash, wenn der Dateiname keine Folge von Dezimalzahlen ist, andernfalls handelt es sich um den >&fdBourne-Umleitungsoperator).
  • &> file: bash und zsh 3+
  • > file >[2=1]: rc und Derivate
  • > file ^&1: Fisch

¹ !selbst wurde von der Korn-Shell eingeführt und ist in der Bourne-Shell nicht verfügbar, wurde jedoch von POSIX spezifiziert und sollte daher in jeder modernen Implementierung shverfügbar sein .sh

verwandte Informationen