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

を使用して$(...)、そのコードを実行するサブプロセスを作成しました。

当然、そのプロセスの親は現在のシェルになるため、リストに表示されます。

回避策として、その PID をリストから削除できます。まず、サブシェル PID にアクセスする方法を知っておく必要があります: $$ in a script vs $$ in a subshel​​l . これで、フィルターで除外できます(いいえ、機能しません)。

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