AIX - BASH REGEX INTO IF 语句 = 分段错误(核心转储)

AIX - BASH REGEX INTO IF 语句 = 分段错误(核心转储)

大家好,感谢您的支持!

我在 bash 脚本中通过 =~ 操作数使用 REGEX 时遇到问题。

环境:GNU bash,版本 4.1.7(1)-release (powerpc-ibm-aix5.1.0.0)

bash-4.1$ if [[ a =~ a ]]; then echo match; fi
Segmentation fault(coredump)

bash版本:

bash-4.1$ bash --version
GNU bash, version 4.1.7(1)-release (powerpc-ibm-aix5.1.0.0)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

我正在寻找识别给定参数是否为整数的最佳方法,因为我需要确保给定参数是PID(进程号) 在Linux中我总是使用=~

我一直无法找到解决方案。我在网上搜索过但找不到类似的东西。

先感谢您

答案1

如果可能的话,我会使用 bash 测试 $pid 之外的其他方法。

我会使用killorawk代替:

1 - 仅检查 $pid 是否是 AIX 上的(有效、正在运行)进程:

kill -s 0 -- "$pid" && echo "pid $pid is a running process"

注意:这不会杀死进程,信号 0 仅在 $pid 存在时起作用。

然而(感谢 @ChrisDavies 在评论中指出!):“...您必须是进程(或根)的所有者,以避免出现“不允许操作”错误”

2 - 如果您不确定是否获得了正确的列(这种情况在 ps 输出中经常发生,因为第一列(USER)可以以空格开头,也可以不以空格开头,具体取决于用户名的长度):

您可能需要在输入行之前添加一个空格:

ps ... | sed -e 's/^/ /' | awk -v pid="$pid" ' something on column $pid '

:这将帮助 awk(以及排序和其他所有内容)不会在第一列或第二列($1 或 $2)中错误地看到某些 pid,具体取决于“第一”列的内容是否以空格开头。

3 - 为了完全避免这个问题,您还可以使用自定义 ps :您仍然需要 sed,因为较短的 pid 将以空格开头,而最长的则不会!

ps -e -o 'pid, ppid, user, etime, args' \
| sed -e 's/^/ /' \
| awk '
  BEGIN {
      col_pid=1;  col_ppid=2; col_user=3; col_etime=4 start_args=5 
  }
  
  ( $col_pid !~ "/^[0-9]+$/ ) {
      print "line: " FNR " : column " col_pid " does NOT match a number? : \047" $col_pid "\047" 
  }
  '
# you could also do the sed part with awk, but it would : recompute $0, losing spacings

相关内容