Muitos shells otimizam o último comando em um script executando o comando no mesmo processo:
$ sh -c 'ps
ps'
PID TTY TIME CMD
32673 pts/3 00:00:00 zsh
32696 pts/3 00:00:00 sh
32697 pts/3 00:00:00 ps
PID TTY TIME CMD
32673 pts/3 00:00:00 zsh
32696 pts/3 00:00:00 ps
Veja como o segundo ps foi executado no processo que inicialmente executou sh (32696) e, em seguida, seu pai é o pai de sh (no meu caso aqui, zsh meu shell interativo) .
Você pode evitar isso adicionando uma linha exit :
#! /bin/sh -
foo
exit
sh não pode executar foo no mesmo processo porque ainda tem mais para interpretar depois que foo tiver terminado. Portanto, ele executará foo em outro processo e aguardará. Em seguida, execute exit (que sairá do script com o mesmo status de saída de foo ).
Agora, isso não é muito ideal, pois você pode ter salvado um processo aqui.
A melhor maneira de ter foo saber sobre o caminho de foocaller poderia ser:
#! /bin/sh -
CALLER=$0 foo
Em seguida, foo pode consultar a variável de ambiente CALLER para obter o caminho de seu chamador ( import os;print(os.environ["CALLER"]) em python)