以下shell腳本獲取參數列表,將Unix路徑轉換爲WINE/Windows路徑並調用WINE下的給定可執行文件。在shell腳本中引用命令行參數
#! /bin/sh
if [ "${1+set}" != "set" ]
then
echo "Usage; winewrap EXEC [ARGS...]"
exit 1
fi
EXEC="$1"
shift
ARGS=""
for p in "[email protected]";
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
UPDATE:eval "$CMD"
的伎倆。 「\t
」問題似乎是echo的錯誤:「如果第一個操作數是-n,或者任何操作數包含反斜槓('\')字符,則結果將由實現定義。」 (POSIX specification of echo
)
這兩個路徑都是完全有效的Unix路徑*作爲腳本*的輸入。單引號應該消除逃脫空間的需要。 「\ t」由`winepath`命令自動生成(它將「/ tmp」變爲「Z:\ tmp」)。 – 2008-08-30 17:01:24