Obtendo o caminho pai de um script

Obtendo o caminho pai de um script

Eu tenho um script bash foocaller, que chama um script Ruby foo:

Foocaller

/path/to/foo

Dentro de foo, quero obter o caminho de foocaller. Seguindoesta sugestão, coloquei o seguinte código para fazer isso:

foo

#!/usr/bin/env ruby
puts File.read("/proc/#{Process.ppid}/cmdline")

Quando corro:

$ bash foocaller

então obtenho o desejado:

bash^@/path/to/foocaller

mas quando eu ligo diretamente foocaller:

$ foocaller

então eu entendo isso:

/bin/bash^@--noediting^@-i

que não mostra o caminho para foocaller. Como posso obter o caminho foocallerligando diretamente foocallersem bash?

Responder1

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 psfoi executado no processo que foi executado inicialmente sh(32696), e então seu pai é o shpai do (no meu caso aqui, zshmeu shell interativo).

Você pode evitar isso adicionando uma exitlinha:

#! /bin/sh -
foo
exit

shnão pode ser executado foono mesmo processo porque ainda tem mais para interpretar depois de fooconcluído. Portanto, ele será executado fooem outro processo e aguardará por ele. E então execute exit(o que encerrará o script com o mesmo status de saída de foo).

Agora, isso não é o ideal, pois você poderia ter salvo um processo aqui.

A melhor maneira de saber foosobre o caminho foocallerseria contá-lo:

#! /bin/sh -
CALLER=$0 foo

Em seguida, foopode consultar a CALLERvariável de ambiente para obter o caminho de seu chamador ( import os;print(os.environ["CALLER"])em python)

informação relacionada