私のアプリケーション:
#!/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