繁体   English   中英

如何从TCL Shell执行Linux命令?

[英]How to execute the Linux command from a TCL shell?

我正在从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 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 00 00

当通过exec命令和tik运算符从tcl shell尝试时,上述命令失败。 请指教。

% [ 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

当您有大量这样的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}

您可以将命令设置为变量,然后使用{*}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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM