À des fins d'expérimentation, j'ai créé un binaire qui imprime le $PATH
, et appelle which
comme suit :
#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;
}
quand je l'exécute dans un environnement vide via
env -i ./printpath
J'obtiens l'impression suivante :
got no path
/usr/bin/which
Ma question est :pourquoi le which
est correct binaire appelé, même s'il n'y a pas de $PATH
?
Réponse acceptée :
Vous avez utilisé le system
fonction, il utilisera donc un autre shell pour exécuter la commande which which
. À partir du 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.
Si vous changez which which
commande pour echo $PATH
:
$ env -i ./a.out
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Si vous modifiez votre code pour utiliser execve
au lieu de system
, vous obtiendrez le résultat attendu :
#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;
}
Compilez et exécutez-le :
$ gcc test.c && env -i ./a.out
got no path