Zu Experimentierzwecken habe ich eine Binärdatei erstellt, die den $PATH
ausgibt und ruft which
auf wie folgt:
#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
ausführeenv -i ./printpath
Ich bekomme folgenden Ausdruck:
got no path
/usr/bin/which
Meine Frage ist:warum ist der richtige which
Binary aufgerufen, auch wenn kein $PATH
vorhanden ist ?
Akzeptierte Antwort:
Sie haben system
verwendet Funktion, also wird es eine andere Shell verwenden, um den Befehl which which
auszuführen . Von man system
:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c
command, and returns after the command has been completed. During exe‐
cution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT
will be ignored.
Wenn Sie which which
ändern Befehl zum echo $PATH
:
$ env -i ./a.out
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Wenn Sie Ihren Code ändern, um execve
zu verwenden statt system
, erhalten Sie die erwartete Ausgabe:
#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");
execve("echo $PATH");
return 0;
}
Kompilieren und ausführen:
$ gcc test.c && env -i ./a.out
got no path