在Bash脚本中调用Gawk时返回值为“134”,这是什么意思?

19

当我在Bash脚本中使用Gawk时,遇到了非常奇怪的问题。

在这个脚本中,我使用一个函数来处理一些文本。即使是非常简单的Gawk命令也会返回错误134。

 #!/bin/bash

 testFunc()
 {
   log "Before gawk: $?"
   gawk '{print}' file
   log "After gawk: $?"
 }

如果我在控制台手动运行此脚本,它将完美地工作。$?将始终为0,表示成功,但如果我将此脚本用作Linux启动脚本放置在etc/rc.d/目录下的3级别中,在执行Gawk之后,$?始终为134。134是什么意思?

如果我将替换为,结果是正常的。$?为0。


这意味着之前的命令执行失败了。 - devnull
不,如果我将“gawk '{print}' file”替换为“gawk --version”,结果是正确的,$?是0。 - mailzyok
file 的内容是什么? - chepner
文件的内容如下: abc,1,2 [换行] def,3,4 - mailzyok
2个回答

44

退出代码 134 表示您的程序已中止(收到 SIGABRT),可能是由于断言失败导致的。

(如下方评论中@hobbs所解释的那样,您需要从退出代码中减去 128 才能映射到列表中的 SIGABRT。) 您可能需要给出命令log的完整路径和file的完整路径。

这里是由命令kill生成的信号列表:

kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGUSR1
17) SIGUSR2     18) SIGCHLD     19) SIGPWR      20) SIGWINCH
21) SIGURG      22) SIGIO       23) SIGSTOP     24) SIGTSTP
25) SIGCONT     26) SIGTTIN     27) SIGTTOU     28) SIGVTALRM
29) SIGPROF     30) SIGXCPU     31) SIGXFSZ     32) SIGWAITING
33) SIGLWP      34) SIGFREEZE   35) SIGTHAW     36) SIGCANCEL
37) SIGLOST     38) SIGXRES     41) SIGRTMIN    42) SIGRTMIN+1
43) SIGRTMIN+2  44) SIGRTMIN+3  45) SIGRTMAX-3  46) SIGRTMAX-2
47) SIGRTMAX-1  48) SIGRTMAX

28
对于那些好奇的人,状态码是128加上被捕获的信号。134-128=6,信号6是SIGABRT - hobbs
@mailzyok,我已要求检查“您可能需要提供命令日志的完整路径和文件的完整路径”。 - BMW
谢谢。在真正的脚本中,这个文件路径像是"/private/data/data.txt"。我不知道你为什么需要命令日志的路径,因为它是一个内部函数,应该没有问题。 - mailzyok
私有目录已挂载为nfs。 - mailzyok
1
谢谢,这太棒了!我还发现了这个链接,进一步解释了Linux退出代码 - http://tldp.org/LDP/abs/html/exitcodes.html - assafmo
显示剩余6条评论

1
在C++代码中,有一种情况是当代码抛出未被处理的异常时。例如:
if (someval > 10) {
    throw runtime_error("number too large");
}

执行包含此代码的二进制文件,当遇到这种情况时,会得到退出状态码134,至少在我的情况下:操作系统是CentOS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接