2012-04-29 138 views
4

我有egrep命令的问题。 当我在tcsh中执行我的命令,这是工作完美,但是当我从TCL脚本或tclsh的执行它,我得到:TCL:exec egrep“子进程异常退出”

子进程异常退出

我的TCL代码:

exec egrep -i "^(\\\s+)?(tvf::)?LAYOUT\\\s+PATH" test_file 

的test_file里面包含

LAYOUT PATH "file1" 
    LAYOUT PATH "file2" 
//LAYOUT FILE "file 3" 
foo string 
tvf::LAYOUT PATH "file4" 
    tvf::LAYOUT PATH "file5" 

+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++

您好所有,

我做了一些额外的调查,也是32位计算机上运行此命令。 命令正常工作与32位的egrep

结果:

LAYOUT PATH "file1" 
    LAYOUT PATH "file2" 
tvf::LAYOUT PATH "file3" 
     tvf::LAYOUT PATH "file3" 

文件/ bin中/ egrep的 * /斌/ egrep的:符号链接`grep的“*

文件/ bin/grep */bin/grep:ELF 32位LSB可执行文件,英特尔80386,版本1(SYSV),用于GNU/Linux 2.2.5,动态链接(使用共享库),剥离*

但是当我删除额外的反斜杠:

exec egrep -i "^(\s+)?(tvf::)?LAYOUT\s+PATH" test_file 

命令返回错误:

子进程退出异常

64位机器上的egrep的版本是:

file/bin/egrep */bin中/ egrep的:符号链接`grep的'*

文件/斌/ grep的 * /斌/ grep的:ELF 64位LSB的可执行文件,AMD X86-64,版本1(SYSV),对于GNU/Linux 2.6.9,动态链接(使用共享库),用于GNU/Linux 2.6.9,剥离*

+0

我,正是很多反斜线你到了那里... – 2012-04-29 21:38:08

+0

你好多纳尔,如果没有这些额外的反斜杠在32位机器 – 2012-04-30 06:49:29

+1

把RE的命令返回错误在'{'大括号''''会让你减少数量,因为什么都不需要引用。 – 2012-04-30 13:55:46

回答

9

grep使用其退出状态指示存在/不存在匹配(man page) - 如果不匹配退出状态为1.Tcl的exec将任何非零退出状态视为异常情况。您需要执行调用catch,检查catch的返回值,如果非零则检查$errorCode变量。一个完整的例子:http://wiki.tcl.tk/exec,点击“显示讨论”并向下滚动到KBK的例子。

exec top -b -n 1 -c | egrep lnx64.o/vsimk | wc -l 

TCL对此很不开心斜杠“/”在grep的表达:

0

我运行下面的命令时,有同样的错误。 它得到了固定,通过使用“-ignorestderr”开关:

exec -ignorestderr -- top -b -n 1 -c | egrep lnx64.o/vsimk | wc -l.