下面的shell脚本接受一系列参数,将Unix路径转换为WINE/Windows路径,并在WINE下调用给定的可执行文件。
请注意:
编辑:"\t" 通过两个间接级别进行扩展:首先,"$p"(和/或"$ARGS")被扩展为 "Z:\tmp\smtlib3cee8b.smt";然后,"\t" 被扩展为制表符。这(似乎)等同于:
更新:
#! /bin/sh
if [ "${1+set}" != "set" ]
then
echo "Usage; winewrap EXEC [ARGS...]"
exit 1
fi
EXEC="$1"
shift
ARGS=""
for p in "$@";
do
if [ -e "$p" ]
then
p=$(winepath -w $p)
fi
ARGS="$ARGS '$p'"
done
CMD="wine '$EXEC' $ARGS"
echo $CMD
$CMD
然而,命令行参数的引用存在问题。
$ winewrap '/home/chris/.wine/drive_c/Program Files/Microsoft Research/Z3-1.3.6/bin/z3.exe' -smt /tmp/smtlib3cee8b.smt
Executing: wine '/home/chris/.wine/drive_c/Program Files/Microsoft Research/Z3-1.3.6/bin/z3.exe' '-smt' 'Z: mp\smtlib3cee8b.smt'
wine: cannot find ''/home/chris/.wine/drive_c/Program'
请注意:
- 可执行文件路径在第一个空格处被截断,即使它已经用单引号括起来了。
- 最后一个路径中的字面值“\t”被转换为制表符。
编辑:"\t" 通过两个间接级别进行扩展:首先,"$p"(和/或"$ARGS")被扩展为 "Z:\tmp\smtlib3cee8b.smt";然后,"\t" 被扩展为制表符。这(似乎)等同于:
Y='y\ty'
Z="z${Y}z"
echo $Z
这将产生
zy\tyz
并且不是
zy yz
更新:
eval "$CMD"
就是解决方法。"\t
" 的问题似乎是 echo 命令的锅: "如果第一个操作数是 -n,或者任何操作数包含反斜杠('\')字符,则结果是实现定义的。" (echo 命令的 POSIX 规范)