如何从TCL shell执行Linux命令?
我正在从linux环境成功执行以下命令如何从TCL shell执行Linux命令?,linux,tcl,Linux,Tcl,我正在从linux环境成功执行以下命令 [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 00 10 94 00 00 00 0a 08 06 00 01 08 00 06
[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 00 10 94 00 00 00 0a 08 06 00 01
08 00 06 04 00 01 00 10 94 00 00 00 00 0a c0 01 01 02
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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 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命令和back 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'
% [ exec {*}$cmd34 ]
extra characters after close-brace
您可以将命令设置为变量,并使用
{*}
或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
请注意,表达式用大括号括起来,以避免任何替换,并将其视为文字值。如果需要在表达式中使用大括号,请确保使用反斜杠将其转义,如
\{
您可以将命令设置为变量,并使用{*}
或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
请注意,表达式用大括号括起来,以避免任何替换,并将其视为文字值。如果需要在表达式中使用大括号,请确保使用反斜杠将其转义,如
\{
您可以将命令设置为变量,并使用{*}
或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
请注意,表达式用大括号括起来,以避免任何替换,并将其视为文字值。如果需要在表达式中使用大括号,请确保使用反斜杠将其转义,如
\{
您可以将命令设置为变量,并使用{*}
或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
请注意,表达式中用大括号括起来,以避免任何替换,并将其视为文字值。如果需要在表达式中使用大括号,请确保在有一块shell脚本时使用反斜杠(如
\{
):
tshark-r/home/arts2/STC_-CAPTURE/sim_-venom_-sanity_-DEVICE1_-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}
当您有一块shell脚本时,如下所示:
tshark-r/home/arts2/STC_-CAPTURE/sim_-venom_-sanity_-DEVICE1_-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}
当您有一块shell脚本时,如下所示:
tshark-r/home/arts2/STC_-CAPTURE/sim_-venom_-sanity_-DEVICE1_-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}
当您有一块shell脚本时,如下所示:
tshark-r/home/arts2/STC_-CAPTURE/sim_-venom_-sanity_-DEVICE1_-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}
不要使用单引号(除非您将字符串作为子进程传递给shell)。大括号在Tcl中具有等效功能。不要使用单引号(除非您将字符串作为子进程传递给shell)。大括号在Tcl中具有等效功能。不要使用单引号(除非您将字符串作为子进程传递给shell)。大括号在Tcl中具有等效的功能。不要使用单引号(除非您将字符串作为子进程传递给shell)。大括号在Tcl中具有等效的功能。抱怨是因为在您的代码中有
[0-9a-f]
,如果您没有正确引用它,Tcl会将其解释为命令调用。是的,我遗漏了一些东西。我尝试了您的两个建议,但仍然看到如下问题:-e expression#1,char 45:unterminated's'sed expression似乎已被咀嚼。s/^[0-9a-f]*\s\(\(\s[0-9a-f][0-9a-f]\{1,16\)1/1/p1/1/p1/1/p1/1/p1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/p1/p1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/9 A-6}。p,p
s'`@udayashankar:*
和\1
之间仍然缺少一条规则斜杠:应该是*/\1
。这就是s
表达式未终止的原因。投诉是因为在您的代码中,您有[0-9a-f]
,如果您没有正确引用它,Tcl会将其解释为命令调用。是的,我遗漏了一些东西。我尝试了您的两个建议,但仍然看到如下问题:-e expression#1,char 45:unterminated's'sed expression似乎已被咀嚼。s/^[0-9a-f]*\s\(\(\s[0-9a-f][0-9a-f]\{1,16\).*$/\1/p
不应该变成s/^[0-9a-f]*s((s[0-9a-f][0-9a-f]){1,16}.*^A/p
,对吗?是的,现在我添加了反斜杠,但仍然是se