Aqui está uma maneira de alcançá-lo:
$ cat parent.sh
#!/bin/sh
echo parent.sh running
./child.sh
$ cat other.sh
#!/bin/sh
echo other.sh running
./child.sh
$ cat child.sh
#!/bin/sh
parent="$(ps -o comm= -p $PPID)"
if [ "$parent" != parent.sh ]; then
echo this script should be directly executed by parent.sh, not by $parent
exit 1
fi
echo "child.sh proceeding"
$ ./parent.sh
parent.sh running
child.sh proceeding
$ ./other.sh
other.sh running
this script should be directly executed by parent.sh, not by other.sh
Observe que isso é apenas verificar se o processo pai imediato é o esperado. Se você precisa ir mais fundo na hierarquia do processo, você precisa adaptar o script para escalar o relacionamento pai.
Uma maneira alternativa pode ser exportar uma variável personalizada e verificar se ela está configurada nos processos filhos.
Nenhum desses métodos é realmente seguro, pois existem maneiras simples de falsificar um nome de processo ou definir qualquer variável.