POSIX-Funktion zum Suchen von PATH für eine ausführbare Datei?

8

Gibt es eine POSIX-Funktion, die PATH für eine ausführbare Datei gemäß der Beschreibung der POSIX-Spezifikation durchsucht der Umgebungsvariable PATH und gibt den absoluten Pfad zur ausführbaren Datei zurück?

Wenn nicht, gibt es eine einfache, sichere, standardmäßige und zuverlässige Möglichkeit, PATH zu durchsuchen?

Bearbeiten: Die Funktion execvpe() von glibc macht ihre eigene PATH suche, also vermute ich, dass es keine spezifische PATH Suchfunktion gibt, die vom Standard definiert wird.

Edit 2: Ich möchte den Code von jemand anderem nicht kopieren oder die PATH Suche selbst aus ein paar Gründen implementieren:

  • DRY
  • Mehr Code muss ich testen und pflegen
  • Mögliche Lizenzprobleme
  • POSIX sagt: "Wenn PATH nicht gesetzt oder auf null gesetzt ist, ist die Pfadsuche implementierungsdefiniert." Ich möchte, dass das Verhalten in diesen Fällen mit dem übereinstimmt, was auch immer das System tut, aber ich kann das nicht, wenn es keine Standardfunktion gibt, die ich aufrufen kann.
Richard Hansen 15.06.2012, 21:42
quelle

3 Antworten

7
  

Gibt es eine POSIX-Funktion, die PATH nach der Beschreibung der PATH-Umgebungsvariablen in der POSIX-Spezifikation durchsucht und den absoluten Pfad zur ausführbaren Datei zurückgibt?

Nein.

  

Wenn nicht, gibt es einen einfachen, sicheren, standardmäßigen und zuverlässigen Weg, PATH zu suchen?

Ja und nein. Ja, es gibt einen Standard für das Format PATH , aus dem die Korrektheit / Zuverlässigkeit der Implementierungen folgt.

Nein, es gibt keine Standardfunktion, die dies tut. Kopieren von Code ist Ihre beste Wette.

  

Wenn PATH nicht gesetzt oder auf null gesetzt ist, ist die Pfadsuche implementierungsdefiniert.

Das heißt, Sie können nicht portable replizieren, was execvp macht, aber die Suche nach /bin:/usr/bin ist eine ziemlich sichere Wette. Alternativ kann in diesem Fall nur ein Fehler ausgelöst werden.

(Ich gebe zu, es wäre schön gewesen, wenn POSIX diese Funktion gehabt hätte, aber es ist einfach nicht da.)

    
Fred Foo 16.06.2012, 11:47
quelle
3

Das Befehlszeilenprogramm which wird das tun. Hier ist die Manpage

und die Quelle

    
gcochard 15.06.2012 21:53
quelle
0

Wie wäre es mit etwas wie:

? %Vor%

und dann seine Ausgabe lesen? Dies würde zu einem Verhalten führen, das der Behandlung von leerem / nicht gesetztem PATH des Systems entspricht, und es ist möglicherweise einfacher als die manuelle Suche nach PATH .

Dieser Ansatz hat einige Nachteile:

  • Wenn somecommand vom Benutzer stammt, muss es möglicherweise bereinigt werden, um Code-Injection-Angriffe zu verhindern. Das würde zur Komplexität beitragen.
  • Das zuverlässige Lesen des Streams während der Behandlung aller möglichen Fehlerfälle ist nicht trivial. Mehr Komplexität.
  • Wenn somecommand eine spezielle integrierte Shell ist (z. B. set ), werden falsche Ergebnisse zurückgegeben. Dieser Fall sollte erkennbar sein, aber was dann? Mehr Komplexität.
Richard Hansen 17.06.2012 05:02
quelle

Tags und Links