我遇到了这种情况,我必须执行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
%
我只是好奇。还有其他选择来处理这种情况吗?使用{*}
也观察到同样的问题。
答案 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
属性分隔...