#!/usr/bin/env bash
sleep 3 & # Spawn a child
trap '
pgrep -P $$ # Outputs one PID as expected
PIDS=( $( pgrep -P $$ ) ) # Saves an extra nonexistant PID
echo "PIDS: ${PIDS[@]}" # You can see it is the last one
ps -o pid= "${PIDS[@]:(-1)}" ||
echo "Dafuq is ${PIDS[@]:(-1)}?" # Yep, it does not exist!
' 0 1 2 3 15
输出
11800
PIDS: 11800 11802
Dafuq is 11802?
它只发生在陷阱中。 为什么将不存在的PID附加到数组?以及如何避免这种奇怪的行为?
答案 0 :(得分:2)
通过使用$(...)
,您创建了一个将执行该代码的子流程。
当然,该进程的父进程将是当前的shell,因此它将被列出。
至于变通方法,您可以从列表中删除该PID。首先,您必须知道如何访问子shell PID:$$ in a script vs $$ in a subshell。 现在你可以将其过滤掉(不,它不起作用):
PIDS=( $( pgrep -P $$ | grep -v ^$BASHPID$ ) )