我的应用程序:
#!/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
实现中可用。