我遇到了这种情况,在这里我必须执行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
由于路径中包含空格,因此在评估代码时,Tcl
将其C:\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
%
我只是好奇。还有其他解决方案吗?{*}
也观察到相同的问题。
您的问题是,您希望空间成为从变量获取的参数的一部分,但要分隔来自另一个参数的参数。默认情况下,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}
这也不是太好(而且很容易忘记正确引用它)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句