4

egrep 命令有问题。当我在 tcsh 中执行命令时,它运行良好,但是当我从 tcl 脚本或 tclsh 中执行它时,我得到:

子进程异常退出

我的 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 */bin/egrep: 到 `grep' 的符号链接*

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

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

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

命令返回错误:

子进程异常退出

64位机器上的egrep版本是:

文件 /bin/egrep */bin/egrep: 到 `grep' 的符号链接*

文件 /bin/grep */bin/grep:ELF 64 位 LSB 可执行文件,AMD x86-64,版本 1 (SYSV),适用于 GNU/Linux 2.6.9,动态链接(使用共享库),适用于 GNU/Linux 2.6 .9,剥离*

4

2 回答 2

11

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

于 2012-04-29T16:54:23.470 回答
0

运行以下命令时我遇到了同样的错误:

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

TCL 对 grep 表达式中的正斜杠“/”不满意。它通过使用“-ignorestderr”开关得到修复:

exec -ignorestderr -- top -b -n 1 -c | egrep lnx64.o/vsimk | wc -l.
于 2017-02-20T18:16:33.553 回答