我的應用程式:
#!/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 &
- 它運行沒有任何問題。我想從 shell 啟動它的原因是,因為我想每分鐘 crontab 一次。
答案1
>&
不支援語法sh
。您sh
在該腳本中明確用作 shell。您需要將該行重寫為:
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
給它是沒有意義的)。
為了完整起見,在各種 shell 中重定向 stdout 和 stderr 的語法:
> file 2>&1
:Bourne、POSIX 及其衍生物和魚>& file
:csh、tcsh、zsh 和 bash 4+(儘管zsh
只有bash
當檔案名稱不是十進位數字序列時才有效,否則是>&fd
Bourne 重定向運算子)。&> file
:bash 和 zsh 3+> file >[2=1]
: rc 和衍生物> file ^&1
: 魚
1!
本身是由 Korn shell 引入的,在 Bourne shell 中不可用,儘管已由sh
POSIX 指定,因此應該在任何現代sh
實作中可用。