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 foocaller
ligando diretamente foocaller
sem 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 ps
foi executado no processo que foi executado inicialmente sh
(32696), e então seu pai é o sh
pai do (no meu caso aqui, zsh
meu shell interativo).
Você pode evitar isso adicionando uma exit
linha:
#! /bin/sh -
foo
exit
sh
não pode ser executado foo
no mesmo processo porque ainda tem mais para interpretar depois de foo
concluído. Portanto, ele será executado foo
em 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 foo
sobre o caminho foocaller
seria contá-lo:
#! /bin/sh -
CALLER=$0 foo
Em seguida, foo
pode consultar a CALLER
variável de ambiente para obter o caminho de seu chamador ( import os;print(os.environ["CALLER"])
em python)