Abrufen des übergeordneten Pfads aus einem Skript

Abrufen des übergeordneten Pfads aus einem Skript

Ich habe ein Bash-Skript foocaller, das ein Ruby-Skript aufruft foo:

Abonnieren

/path/to/foo

Innerhalb foomöchte ich den Pfad von erhalten foocaller. Nachdieser Vorschlag, dazu habe ich den folgenden Code eingegeben:

foo

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

Wenn ich laufe:

$ bash foocaller

dann bekomme ich das gewünschte:

bash^@/path/to/foocaller

aber wenn ich direkt aufrufe foocaller:

$ foocaller

dann bekomme ich das:

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

der den Pfad zu nicht anzeigt foocaller. Wie kann ich den Pfad zu erhalten, foocallerindem ich direkt foocallerohne aufrufe bash?

Antwort1

Viele Shells optimieren den letzten Befehl in einem Skript, indem sie den Befehl im selben Prozess ausführen:

$ 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

Sehen Sie, wie das zweite Element psim ursprünglich laufenden Prozess sh(32696) ausgeführt wurde und dass sein übergeordnetes Element dann das shübergeordnete Element von ist (in meinem Fall hier zshmeine interaktive Shell).

Sie können dies vermeiden, indem Sie eine exitZeile hinzufügen:

#! /bin/sh -
foo
exit

shkann nicht im selben Prozess ausgeführt werden , da es nach Abschluss foonoch weitere Interpretationen gibt . Daher wird es stattdessen in einem anderen Prozess ausgeführt und wartet darauf. Und dann ausgeführt (wodurch das Skript mit demselben Beendigungsstatus wie von beendet wird ).foofooexitfoo

Das ist nun nicht ganz optimal, da man hier einen Vorgang hätte einsparen können.

Eine bessere Möglichkeit, fooden Pfad zu kennen, foocallerkönnte sein, ihn wie folgt anzugeben:

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

Anschließend fookönnen Sie die Umgebungsvariable abfragen CALLER, um den Pfad ihres Aufrufers zu erhalten ( import os;print(os.environ["CALLER"])in Python).

verwandte Informationen