こんにちは皆さん、ご支援いただきありがとうございます!
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(および並べ替えと他のすべての項目)が最初または2番目の列($ 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