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 sh
in 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 zsh
und 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; pgrep
liest die Standardeingabe nicht, daher ps
ist 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+ (allerdingszsh
nurbash
, wenn der Dateiname keine Folge von Dezimalzahlen ist, andernfalls handelt es sich um den>&fd
Bourne-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 sh
verfügbar sein .sh