web-dev-qa-db-ja.com

構文エラー: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したいからです。

5
htorbov

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

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

>&は、stdoutとstderrの両方をファイルにリダイレクトするためのcsh構文(zshおよびbashの最近のバージョンでもサポートされています)です。

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:ボーン、POSIXおよび派生物と魚
  • >& file:csh、tcsh、zsh、bash 4+(ただし、zshbashは、ファイル名が10進数のシーケンスでない場合のみ、それ以外の場合は>&fd Bourneリダイレクト演算子)。
  • &> file:bashおよびzsh 3以降
  • > file >[2=1]:rcおよび派生物
  • > file ^&1: 魚
7