Erro de sintaxe: número fd incorreto?

Erro de sintaxe: número fd incorreto?

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 shcomo shell nesse script. Você precisa reescrever essa linha como:

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

Responder2

>&é ocshsintaxe (também suportada por zshversõ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; pgrepnão lê seu stdin, então canalizar a saída pspara 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 em zshe bashsomente quando o nome do arquivo não seja uma sequência de dígitos decimais, caso contrário, é o >&fdoperador 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 shpelo POSIX, portanto deve estar disponível em qualquer shimplementação moderna.

informação relacionada