Minha aplicação:
#!/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
Dá erro:
./d2gs.sh: 14: ./d2gs.sh: Erro de sintaxe: número fd inválido
O que é estranho, já que quando eu começo wine "C:/D2GS/D2GS.exe" >& /dev/null &
ele funciona sem problemas. A razão pela qual quero iniciá-lo a partir do shell é porque quero fazer o crontab a cada minuto.
Responder1
>&
não é sintaxe suportada por sh
. Você está usando explicitamente sh
como shell nesse script. Você precisa reescrever essa linha como:
wine "C:/D2GS/D2GS.exe" > /dev/null 2>&1 &
Responder2
>&
é ocshsintaxe (também suportada por zsh
versões recentes do bash
) para redirecionar stdout e stderr para um arquivo.
Em sh
(Bourne (de onde vem) e POSIX), a sintaxe de redirecionamento¹ é:
if ! pgrep D2GS > /dev/null; then
wine C:/D2GS/D2GS.exe > /dev/null 2>&1 &
fi
(você também tem a sintaxe ps/pgrep errada; pgrep
não lê seu stdin, então canalizar a saída ps
para ele é inútil).
Para completar, a sintaxe para redirecionar stdout e stderr em vários shells:
> file 2>&1
: Bourne, POSIX e derivados e peixes>& file
: csh, tcsh, zsh e bash 4+ (embora emzsh
ebash
somente quando o nome do arquivo não seja uma sequência de dígitos decimais, caso contrário, é o>&fd
operador de redirecionamento Bourne).&> file
: bash e zsh 3+> file >[2=1]
: rc e derivados> file ^&1
: peixe
¹ !
em si foi introduzido pelo shell Korn e não está disponível no shell Bourne, embora tenha sido especificado sh
pelo POSIX, portanto deve estar disponível em qualquer sh
implementação moderna.