
私のアプリケーション:
#!/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
>&
~である掘削zsh
bash
stdoutと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