2つの異なるプロセスによって開始されたプロセスがあります(1つは次のものから始まります)。内部にそして他の人は長沙コンテナ)
コマンドでプロセス名を使用してプロセスのpidを取得しようとしましたが、$(pidof $PROCESS_NAME)
正常に動作しました。コマンドは2つのpid値を提供しますが、を使用して個々の値を印刷しようとすると、最初のコマンドだけが最初の値を生成し、2番目のa=(${process_pids[0]})
コマンドb=(${process_pids[1]})
は空の値を印刷します。
配列に2つの要素がある場合でも、長さも1で表されます。process_pids
一方、代わりに有効にすると、numbers_normal=(1234 5678)
1つの値のみが印刷されprocess_pids=$(pidof $PROCESS_NAME)
てもインデックス付けが正しく機能します。echo "pids = $numbers_normal"
このステートメントの問題は何process_pids=$(pidof $PROCESS_NAME)
ですか?それを修正する方法は何ですか?
#!/bin/sh
PROCESS_NAME=process1
process_pids=$(pidof $PROCESS_NAME)
#numbers_normal=(1234 5678)
echo "pids = $process_pids"
a=( ${process_pids[0]} )
b=( ${process_pids[1]} )
echo "0th = $a"
echo "1st = $b"
# lengths are showing as 1, but the number of items are 2
echo "length = ${#process_pids[*]}"
echo "L = ${#process_pids[@]}"
for i in ${process_pids[@]}; do
echo "pid $i parent is $(ps -o ppid= -p $i)"
done
答え1
配列を使用するには、またはなどの配列をサポートするシェルを使用zsh
しますbash
。言語には配列がありません(一部の実装では実装されていますが)。ksh
yash
sh
sh
一部アレイサポートはさまざまな方法で拡張されています。だからここでshe-bangはではなくて#! /bin/bash -
はなりません#!/bin/sh
。
process_pids
その後、配列に初期化する必要があります。
process_pids=($(pidof -- "$PROCESS_NAME"))
手続き型置換の周りに追加の括弧があることに注意してください。現在の割り当てはprocess_pids
スカラーに設定されています。
$(...)
宣言で引用符で囲まれていない項目を残すと、分割+glob演算子(分割のみを使用)をarray=(...)
呼び出し、これが変更されていないと仮定し、出力は出力からpidを区切るために使用される改行または空白文字に分割されます。zsh
$IFS
pidof
pidof
[@]
これを使用すると、ループは引用符(予想どおり)で正しく機能します。
for i in "${process_pids[@]}"; do