두 개의 서로 다른 프로세스에 의해 시작된 프로세스가 있습니다(하나는 다음에 의해 시작됨).내부에그리고 다른 사람들은창사컨테이너)
명령을 통해 프로세스 이름을 사용하여 프로세스의 pid를 얻으려고 시도했지만 $(pidof $PROCESS_NAME)
정상적으로 작동했습니다. 명령은 2개의 pid 값을 제공하지만 를 사용하여 개별 값을 인쇄하려고 하면 a=(${process_pids[0]})
첫 b=(${process_pids[1]})
번째 명령만 첫 번째 값을 생성하고 두 번째 명령은 빈 값을 인쇄합니다.
배열에 두 개의 요소가 있더라도 길이도 1로 표시됩니다.process_pids
반면에 대신 활성화하면 numbers_normal=(1234 5678)
하나 의 값만 인쇄 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