使用eval exec和路径中包含空格的可执行文件名

时间:2015-03-30 10:29:45

标签: tcl exec eval

我遇到了这种情况,我必须执行tshark来解码pcap文件。

tshark的位置为C:\Program Files\Wireshark\tshark.exe

% set fileName TestTShark.pcap
TestTShark.pcap
% set sTsharkCmd "-r $fileName  -Tfields -e ip.src"
-r TestTShark.pcap  -Tfields -e ip.src
% set tsharkPath "C:/Program Files/Wireshark/tshark.exe"
C:/Program Files/Wireshark/tshark.exe
% eval exec $tsharkPath $sTsharkCmd > packet.log
couldn't execute "C:\Program": no such file or directory
% exec $tsharkPath $sTsharkCmd > packet.log
tshark: The file " TestTShark.pcap  -Tfields -e ip.src" doesn't exist.
% set tsharkPath "C:\\Program Files\\Wireshark\\tshark.exe"
C:\Program Files\Wireshark\tshark.exe
% exec $tsharkPath $sTsharkCmd > packet.log
tshark: The file " TestTShark.pcap  -Tfields -e ip.src" doesn't exist.
% eval exec $tsharkPath $sTsharkCmd > packet.log
couldn't execute "C:Program": no such file or directory

由于路径包含空格,在评估代码时,TclC:\Program视为程序名称并抛出错误。然后我设法用反斜杠逃离空间如下,然后工作。

%  set tsharkPath "C:/Program\\ Files/Wireshark/tshark.exe"
C:/Program\ Files/Wireshark/tshark.exe
% eval exec $tsharkPath $sTsharkCmd > packet.log
% type packet.log
20.0.0.5
%

我只是好奇。还有其他选择来处理这种情况吗?使用{*}也观察到同样的问题。

2 个答案:

答案 0 :(得分:2)

你的问题是你希望空间成为从变量中获取的参数的一部分,而是将来自另一个参数的参数分开。默认情况下,Tcl会尝试将相同的统一规则应用于所有参数:您需要做一些额外的事情来改变它。

您想使用参数的扩展您的命令

% eval exec $tsharkPath $sTsharkCmd > packet.log

应写成:

% exec $tsharkPath {*}$sTsharkCmd > packet.log

看看它有多短?它也更安全。除非你真的做了非常复杂的事情,否则尽量避免使用eval。 (我的代码中几乎不需要它......)


如果您在没有{*}的情况下使用古老版本的Tcl,则需要执行此操作:

% eval [linsert $sTsharkCmd 0 exec $tsharkPath > packet.log]

这非常不明显,或者说:

% eval {exec $tsharkPath} $sTsharkCmd {> packet.log}

哪个也不太好(并且很容易忘记将其引用正确)。

答案 1 :(得分:1)

eval [list exec $tsharkPath {*}$sTsharkCmd]

将新命令评估为sTsharkCmd属性分隔...