語法錯誤: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 &- 它運行沒有任何問題。我想從 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當檔案名稱不是十進位數字序列時才有效,否則是>&fdBourne 重定向運算子)。
  • &> file:bash 和 zsh 3+
  • > file >[2=1]: rc 和衍生物
  • > file ^&1: 魚

1!本身是由 Korn shell 引入的,在 Bourne shell 中不可用,儘管已由shPOSIX 指定,因此應該在任何現代sh實作中可用。

相關內容