如何从TCL shell执行Linux命令?

时间:2014-10-20 13:54:20

标签: linux tcl

我正在从linux env成功执行以下命令,

[UdayaShankar Das@lxapp-3]# tshark -r sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*\s\(\(\s[0-9a-f][0-9a-f]\)\{1,16\}\).*$/\1/p'

ff ff ff ff ff ff 00 10 94 00 00 0a 08 06 00 01  08 00 06 04 00 01 00 10 94 00 00 0a c0 01 01 02  00 00 00 00 00 00 c0 01 01 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

从tcl shell到exec命令和返回tik操作符尝试时,上面的命令失败了。请指教。

% [ exec tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap  -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p' ]
 invalid command name "0-9a-f"

更新:

感谢您的建议。我试过但似乎没有用:(

  % set cmd34 {tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p'}
 tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p'
 % [ eval exec $cmd34]
 invalid command name "0-9a-f"

还尝试了第二个选项

%set cmd34 {tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p'}
 tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p'
 % [ exec {*}$cmd34 ]
 extra characters after close-brace

2 个答案:

答案 0 :(得分:2)

当你有一大块像这样的shell脚本时:

tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap  -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p'

最简单的运行方法是使用:

set shellscript {tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap  -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p'}
set response [exec /bin/sh -c $shellscript]

或者,将单引号字符更改为大括号:

exec tshark -r /home/arts2/STC_CAPTURE/sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap  -Vx -R frame.number==2 | sed -n {s/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}).*^A/p}

答案 1 :(得分:1)

您可以将命令设置为变量,然后使用{*}eval对其进行评估。

set cmd {tshark -r sim_venom_sanity_DEVICE1_PORT1_1_capture.pcap -Vx -R frame.number==2 | sed -n 's/^[0-9a-f]*\s\(\(\s[0-9a-f][0-9a-f]\)\{1,16\}\).*$/\1/p'}
puts [ eval exec $cmd ] 

如果你有一个或更高的tcl 8.5,你可以使用下面的代码,而不是eval

puts [ exec {*}$cmd ] ; # {*} is for argument expansion which is recommended

请注意,表达式附有大括号以避免任何替换并将它们视为文字值。如果您需要在表达式中使用大括号,请确保使用反斜杠(例如\{

)转义大括号