Obtener la ruta principal de un script

Obtener la ruta principal de un script

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 foocallerllamando directamente foocallersin 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

psVea cómo se ejecutó el segundo en el proceso que se ejecutó inicialmente sh(32696), y luego su padre es el shpadre (en mi caso aquí, zshmi shell interactivo).

Puedes evitarlo agregando una exitlínea:

#! /bin/sh -
foo
exit

shno se puede ejecutar fooen el mismo proceso porque aún tiene más que interpretar una vez foofinalizado. Por lo tanto, se ejecutará fooen 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 fooel camino foocallerpodría ser contarlo:

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

Luego foopuede consultar la CALLERvariable de entorno para obtener la ruta de la persona que llama ( import os;print(os.environ["CALLER"])en Python)

información relacionada