構文エラー: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

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

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

答え2

>&~である掘削zshbashstdoutとstderrをファイルにリダイレクトする構文(最新バージョンでもサポートされています)

sh(Bourne(オリジナル)とPOSIX)では、リダイレクト構文1は次のとおりです。

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

(また、間違ったps / pgrep構文があります。標準入力を読み取らないため、pgrep出力をパイプに接続する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:魚

1!自体はKornシェルと一緒に導入され、Bourneシェルでは使用できません。ただし、POSIXで指定されているため、最新の実装shで利用可能でなければなりません。sh

関連情報