答案 0 :(得分:0)
shell和tcl
变量都标有$
。您的shell将扩展此文档的内容。你不希望这样。 csh
没有$2
的值,因此将其展开为空字符串,awk命令最终变为ps -ef | grep gedit | awk '{ print }'
。这就是为什么你在输出中得到整行。
你的背景有点困惑。如果您希望它通过嵌入式awk命令,则需要从外部$
转义csh
。 (这很可怕,但显然是csh
的情况。)
通常,您不需要尝试合并csh和tcl命令/ etc.像这样,它将极大地帮助你了解正在发生的事情。
set
命令)?我认为您正在寻找foreach
:
$ tclsh
% foreach a [list 1 2 3 4] b [list 5 6 7 8] c [list a b c d] d [list w x y z]
puts "$a $b $c $d"
}
1 5 a w
2 6 b x
3 7 c y
4 8 d z
%
$env(list_ids)
是一个tcl
变量。那个csh
对它一无所知与任何东西无关(除了上面第一点的问题,所以逃避它)。如果您在运行list_ids
脚本的csh
会话中导出tcl
,那么$env(list_ids)
应该在expect
脚本中运行。
您不希望()
命令中的值set
左右我想不到。我相信他们是字面意思。如果您尝试从ps
管道的(shell展开)输出创建一个tcl列表,那么您需要:
set list_ids [list `ps ....`]
但正如我之前所说,你真的不想混合这样的背景。
如果您可以使用非csh
shell,这可能对此有帮助,因为csh
一般都不是很好。
此外,如果您可以直接将expect脚本编写为脚本文件,则不在try脚本中嵌入expect脚本会有所帮助。
答案 1 :(得分:0)
在这里阅读帮助了我很多: http://antirez.com/articoli/tclmisunderstood.html
以下几行可以解决问题,并回答所有问题:
set list_ids [list {`ps -ef | grep gedit | awk '{print \$2 }'}]
set i 0
while {[lindex \$list_ids \$i] > 0} {
puts [lindex \$list_ids \$i]
set i [expr \$i + 1]
}