Синтаксическая ошибка: Неверный номер fd?

Синтаксическая ошибка: Неверный номер fd?

Мое заявление:

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

Выдает ошибку:

./d2gs.sh: 14: ./d2gs.sh: Ошибка синтаксиса: Неверный номер fd

Что странно, так как когда я запускаю wine "C:/D2GS/D2GS.exe" >& /dev/null &- он работает без проблем. Причина, по которой я хочу запустить его из оболочки, в том, что я хочу crontab его каждую минуту.

решение1

>&не поддерживается синтаксис sh. Вы явно используете shкак оболочку в этом скрипте. Вам нужно переписать эту строку как:

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

решение2

>&этоcshсинтаксис (также поддерживаемый zshи последними версиями bash) для перенаправления stdout и stderr в файл.

В sh(Bourne (откуда он взялся) и POSIX) синтаксис перенаправления¹ выглядит следующим образом:

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

(у вас также неправильный синтаксис ps/pgrep; pgrepон не читает свой stdin, поэтому передача ему вывода psбессмысленна).

Для полноты картины приведем синтаксис перенаправления stdout и stderr в различных оболочках:

  • > file 2>&1: Bourne, POSIX и производные и fish
  • >& file: csh, tcsh, zsh и bash 4+ (правда, только в zshтом bashслучае, если имя файла не является последовательностью десятичных цифр, в противном случае это >&fdоператор перенаправления Bourne).
  • &> file: bash и zsh 3+
  • > file >[2=1]: rc и производные
  • > file ^&1: рыба

¹ !сам по себе был представлен оболочкой Korn и недоступен в оболочке Bourne, хотя был указан в shPOSIX, поэтому должен быть доступен в любой современной shреализации.

Связанный контент