Мое заявление:
#!/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, хотя был указан в sh
POSIX, поэтому должен быть доступен в любой современной sh
реализации.