bash: &&で実行されるコマンドリストのkill


以下のようなシェルスクリプトtest.shがあります。

[code]

    #!/bin/bash
    for i in $(seq 10);
    do
      echo "i=$i"
      sleep 1
    done
    
[/code]

それを以下のように実行した場合、 `kill $P1` でプロセス./test.shは直ちに終了します。

[code]

    #!/bin/bash
    ./test.sh &
    P1=$!
    sleep 3
    kill $P1
    echo "end"
    
[/code]

[code]

    i=1
    i=2
    i=3
    end
    
[/code]

ただし./test.shのあとに&&で後続コマンドを設定した場合、./test.shは `kill $P1` で終了しません。

[code]

    #!/bin/bash
    ./test.sh && echo "yes" &
    P1=$!
    sleep 3
    kill $P1
    echo "end"
    
[/code]

[code]

    i=1
    i=2
    i=3
    end
    i=4
    i=5
    i=6
    i=7
    i=8
    i=9
    i=10
    
[/code]

なぜこうなるのでしょうか。  
また、最初の実行と同じように、直ちにtest.shを終了するにはどうすればいいでしょうか。




> また、最初の実行と同じように、直ちにtest.shを終了するにはどうすればいいでしょうか。

伽語蓮弥の回答にあるとおり、P1には`./test.sh && echo "yes"`のPIDが格納されます。  
`./test.sh`はP1の子のプロセスなので、

[code]

    kill $P1
    
[/code]

の代わりに

[code]

    pkill -P ${P1}　＃親プロセスを指定してkill
    
[/code]

とすることにより`./test.sh`が終了します。




> また、最初の実行と同じように、直ちにtest.shを終了するにはどうすればいいでしょうか。

伽語蓮弥の回答にあるとおり、P1には`./test.sh && echo "yes"`のPIDが格納されます。  
`./test.sh`はP1の子のプロセスなので、

[code]

    kill $P1
    
[/code]

の代わりに

[code]

    pkill -P ${P1}　＃親プロセスを指定してkill
    
[/code]

とすることにより`./test.sh`が終了します。

