Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从TCL shell执行Linux命令?_Linux_Tcl - Fatal编程技术网

如何从TCL shell执行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

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