안녕하세요 여러분, 지원해 주셔서 감사합니다!
Bash 스크립트에서 =~ 피연산자와 함께 REGEX를 사용하는 데 문제가 있습니다.
환경: GNU bash, 버전 4.1.7(1)-릴리스(powerpc-ibm-aix5.1.0.0)
bash-4.1$ if [[ a =~ a ]]; then echo match; fi
Segmentation fault(coredump)
배쉬 버전:
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(프로세스 ID) Linux에서는 항상 =~를 사용합니다.
해결책을 찾지 못했습니다. 온라인으로 검색했지만 비슷한 것을 찾을 수 없습니다.
미리 감사드립니다
답변1
가능하다면 bash를 사용하여 $pid 이외의 것을 테스트하겠습니다.
kill
나는 대신에 다음을 사용합니다 awk
:
1 - $pid가 AIX에서 (유효하고 실행 중인) 프로세스인지 확인하세요.
kill -s 0 -- "$pid" && echo "pid $pid is a running process"
참고: 이는 프로세스를 종료하지 않으며 신호 0은 $pid가 존재하는 경우에만 작동합니다.
하지만(댓글에서 지적해 주신 @ChrisDavies에게 감사드립니다!): "..."작업이 허용되지 않음" 오류를 방지하려면 프로세스(또는 루트)의 소유자여야 합니다."
2 - 올바른 열을 얻었는지 확실하지 않은 경우(사용자 이름의 길이에 따라 첫 번째 열(USER)이 공백으로 시작하거나 공백으로 시작할 수 있기 때문에 ps 출력에서 이런 일이 많이 발생합니다):
입력 줄 앞에 공백을 추가해야 할 수도 있습니다.
ps ... | sed -e 's/^/ /' | awk -v pid="$pid" ' something on column $pid '
: 이는 "첫 번째" 열의 내용이 공백으로 시작하는지 여부에 따라 awk(및 정렬 및 기타 모든 항목)가 첫 번째 또는 두 번째 열($1 또는 $2)의 특정 pid를 실수로 보는 일을 방지하는 데 도움이 됩니다.
3 - 이 문제를 완전히 방지하려면 사용자 정의 ps를 사용할 수도 있습니다. 더 짧은 pid는 공백으로 시작하고 가장 긴 pid는 공백으로 시작하지 않기 때문에 여전히 sed가 필요합니다!
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