语法错误: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实现中可用。

相关内容