Error de sintaxis: ¿Número fd incorrecto?

Error de sintaxis: ¿Número fd incorrecto?

Mi aplicación:

#!/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

Da error:

./d2gs.sh: 14: ./d2gs.sh: Error de sintaxis: número fd incorrecto

Lo cual es extraño, ya que cuando empiezo wine "C:/D2GS/D2GS.exe" >& /dev/null &, se ejecuta sin ningún problema. La razón por la que quiero iniciarlo desde Shell es porque quiero programarlo cada minuto.

Respuesta1

>&no es una sintaxis compatible con sh. Estás utilizando explícitamente shcomo shell en ese script. Necesitas reescribir esa línea como:

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

Respuesta2

>&es elcshsintaxis (también compatible con zshversiones recientes de bash) para redirigir tanto stdout como stderr a un archivo.

En sh(Bourne (de donde viene) y POSIX), la sintaxis de redirección¹ es:

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

(También tienes la sintaxis ps/pgrep incorrecta; pgrepno lee su entrada estándar, por lo que canalizar la salida psno tiene sentido).

Para completar, la sintaxis para redirigir tanto stdout como stderr en varios shells:

  • > file 2>&1: Bourne, POSIX y derivados y pescado
  • >& file: csh, tcsh, zsh y bash 4+ (aunque en zshy bashsolo cuando el nombre del archivo no es una secuencia de dígitos decimales; de lo contrario, es el >&fdoperador de redirección de Bourne).
  • &> file: bash y zsh 3+
  • > file >[2=1]: rc y derivados
  • > file ^&1: pez

¹ !en sí fue introducido por el shell Korn y no está disponible en el shell Bourne, aunque POSIX lo ha especificado, shpor lo que debería estar disponible en cualquier shimplementación moderna.

información relacionada