0
#!/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 附加到数组?以及如何避免这种奇怪的行为?

4

1 回答 1

2

通过使用$(...),您创建了一个将执行该代码的子进程。

自然地,该进程的父进程将是当前 shell,因此它会被列出。

至于解决方法,您可以从列表中删除该 PID。首先你必须知道如何访问 subshel​​l PID:$$ in a script vs $$ in a subshel​​l现在您可以将其过滤掉(不,它不起作用):

PIDS=( $( pgrep -P $$ | grep -v ^$BASHPID$ ) )
于 2015-04-26T18:55:34.623 回答