構文エラー: 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 &問題なく実行されるので、これは奇妙です。シェルから起動したい理由は、1 分ごとに crontab を実行したいからです。

答え1

>&は でサポートされていない構文です。そのスクリプトでは をシェルとしてsh明示的に使用しています。その行を次のように書き直す必要があります。sh

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

答え2

>&それはシェル構文 (および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 の構文も間違っています。stdinpgrepを読み取らないので、出力をパイプしてもps意味がありません)。

完全性を期すために、さまざまなシェルで stdout と stderr の両方をリダイレクトする構文は次のとおりです。

  • > file 2>&1: Bourne、POSIXとその派生言語、そして魚
  • >& file: csh、tcsh、zsh、bash 4+ (ただし、ファイル名が 10 進数のシーケンスでない場合にのみ有効。それ以外の場合は Bourne リダイレクト演算子になりますzsh) 。bash>&fd
  • &> file: bash および zsh 3+
  • > file >[2=1]: rc と導関数
  • > file ^&1: 魚

¹!自体は Korn シェルによって導入され、Bourne シェルでは使用できませんが、POSIX で指定されているため、最新の実装shでは使用できるはずです。sh

関連情報