commande linux setsid

Je suis en train d'écrire un wrapper qui va exécuter un script en tant qu'animateur de la séance.
Je suis déconcerté par le comportement de la commande linux setsid. Considérer ce script, appelé test.sh:

#!/bin/bash
SID=$(ps -p $$ --no-headers -o sid)
if [ $# -ge 1 -a $$ -ne $SID ] ; then
  setsid bash test.sh
  echo pid=$$ ppid=$PPID sid=$SID parent
else
  sleep 2
  echo pid=$$ ppid=$PPID sid=$SID child
  sleep 2
fi

La sortie diffère selon qu'il soit exécuté ou de source:

$ bash
$ SID=$(ps -p $$ --no-headers -o sid)
$ echo pid=$$ ppid=$PPID sid=$SID
pid=9213 ppid=9104 sid= 9104
$ ./test.sh 1 ; sleep 5
pid=9326 ppid=9324 sid= 9326 child
pid=9324 ppid=9213 sid= 9104 parent
$ . ./test.sh 1 ; sleep 5
pid=9213 ppid=9104 sid= 9104 parent
pid=9336 ppid=1 sid= 9336 child
$ echo $BASH_VERSION 
4.2.8(1)-release
$ exit
exit

Donc, il me semble que setsid retourne immédiatement lorsque le script est d'origine, mais il attend son enfant lorsque le script est exécuté.
Pourquoi la présence d'un contrôle des ats ont rien à voir avec setsid? Merci!

Edit: Pour clarifier, j'ai ajouté pid/ppid/sid de déclaration pour toutes les commandes.

OriginalL'auteur Matei David | 2012-03-13