Este é um requisito muito estranho. Por que você se importaria com o que o shell interativo invocava seu script, ou invocava algum outro programa que não fosse um shell interativo que, por sua vez, invocava seu script? Isso tem um cheiro muito strong de um problema XY .
Se você realmente precisa saber, pode tentar descobrir, mas não acho que exista um método totalmente confiável, apenas um que funcione em casos típicos.
A partir de $PPID
, rastreie os processos ancestrais de seu script ( ps -o ppid= -p $ancestor_pid
) até encontrar o que você está procurando ou um que indique que você foi longe demais.
Uma estratégia simples é procurar um processo em um grupo de processos diferente ( ps -o pgid= -p $ancestor_pid
). Em circunstâncias normais, se o seu script foi invocado por (um script que foi invocado por) um shell interativo, o processo que você alcançou é um shell com controle de tarefa, que executou seu script (script pai) em um grupo de processos separado .
Aqui estão alguns exemplos de coisas que podem dar errado com essa estratégia:
- Um dos processos dessa cadeia já está morto.
- Seu script não foi chamado por meio de um shell interativo, mas por meio de um cron job, de um programa X11, etc.
Você pode ou não querer verificar se a entrada padrão, a saída padrão e o erro padrão deste processo (por exemplo, com lsof
ou via /proc
se você não precisa de portabilidade além do Linux) são o mesmo terminal do script . Depende de como você quer lidar com casos como
bash$ xterm -e your_script