Tengo un script bash foocaller
, que llama a un script ruby foo
:
Focalista
/path/to/foo
Dentro foo
, quiero obtener el camino de foocaller
. Siguienteesta sugerencia, puse el siguiente código para hacer eso:
foo
#!/usr/bin/env ruby
puts File.read("/proc/#{Process.ppid}/cmdline")
Cuando corro:
$ bash foocaller
entonces obtengo lo deseado:
bash^@/path/to/foocaller
pero cuando llamo directamente foocaller
:
$ foocaller
entonces me sale esto:
/bin/bash^@--noediting^@-i
que no muestra el camino a foocaller
. ¿Cómo puedo obtener la ruta foocaller
llamando directamente foocaller
sin bash
?
Respuesta1
Muchos shells optimizan el último comando en un script ejecutando el comando en el mismo proceso:
$ 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
ps
Vea cómo se ejecutó el segundo en el proceso que se ejecutó inicialmente sh
(32696), y luego su padre es el sh
padre (en mi caso aquí, zsh
mi shell interactivo).
Puedes evitarlo agregando una exit
línea:
#! /bin/sh -
foo
exit
sh
no se puede ejecutar foo
en el mismo proceso porque aún tiene más que interpretar una vez foo
finalizado. Por lo tanto, se ejecutará foo
en otro proceso y lo esperará. Y luego ejecute exit
(lo que saldrá del script con el mismo estado de salida que el de foo
).
Ahora bien, eso no es muy óptimo, ya que podrías haber guardado un proceso aquí.
Una mejor manera de conocer foo
el camino foocaller
podría ser contarlo:
#! /bin/sh -
CALLER=$0 foo
Luego foo
puede consultar la CALLER
variable de entorno para obtener la ruta de la persona que llama ( import os;print(os.environ["CALLER"])
en Python)