Obtendo o caminho pai de um script

1

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

foocaller

/path/to/foo

Dentro de foo , desejo obter o caminho de foocaller . Seguindo esta sugestão , eu coloquei o seguinte código para fazer isso:

foo

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

Quando eu corro:

$ bash foocaller

então eu recebo o desejado:

bash^@/path/to/foocaller

mas quando eu chamo diretamente o foocaller :

$ foocaller

então eu entendo isso:

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

que não mostra o caminho para foocaller . Como posso obter o caminho para foocaller chamando diretamente foocaller sem bash ?

    
por sawa 15.06.2014 / 18:03

1 resposta

3

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)

    
por 15.06.2014 / 21:08

Tags