Zu Versuchszwecken habe ich eine Binärdatei erstellt, die das druckt $PATH
und which
wie folgt aufruft :
#include <stdlib.h>
#include <stdio.h>
int main() {
char *path = getenv("PATH");
if (path)
printf("got a path: %s\n", path);
else
printf("got no path\n");
system("which which");
return 0;
}
wenn ich es in einer leeren Umgebung über laufen lasse
env -i ./printpath
Ich bekomme folgenden Ausdruck:
got no path
/usr/bin/which
Meine Frage ist: Warum wird die richtige which
Binärdatei aufgerufen, auch wenn es keine gibt $PATH
?
echo $PATH
Beispiel sehen.In einer leeren Umgebung werden ausführbare Dateien nur gefunden, wenn Sie den vollständigen Pfad angeben. Probieren Sie es mit
execvp
.Die
system
Funktion ruft eine Shell auf - unter Linux mit Glibc ruft sie auf/bin/sh
(also nichtPATH
erforderlich). Shells definieren zusätzlich zu den aus der Umgebung stammenden Variablen einige eigene Variablen. Sie können sehen, was sie durch Ausführen definierenenv -i /path/to/shell -c set
und welche sie durch Ausführen exportierenenv -i /path/to/shell -c export
. Insbesondere setzen sowohl Dash als auch Bash - die beiden Shells, die Sie wahrscheinlich/bin/sh
unter Linux finden -PATH
auf einen „vernünftigen“ Standardwert (aber nicht exportieren) , wenn es keinen in der Umgebung gibt. Unterschiedliche Schalen setzen unterschiedliche oder gar keine Werte.Auf meinem Computer (und anscheinend auf Ihrem)
which
befindet sich selbst ein/bin/sh
Skript. Die von aufgerufene Shellsystem
verwendet eine eigene Pfadvariable, um daswhich
Programm zu finden , exportiert es jedoch nicht. Die Shell, die daswhich
Skript selbst ausführt, definiert auch diePATH
Variable für den internen Gebrauch.quelle