Con fines de experimentación, creé un binario que imprime el $PATH
, y llama a which
de la siguiente manera:
#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;
}
cuando lo ejecuto en un entorno vacío a través de
env -i ./printpath
Obtengo la siguiente impresión:
got no path
/usr/bin/which
Mi pregunta es:¿por qué es el which
correcto? llamado binario, incluso si no hay $PATH
?
Respuesta aceptada:
Ha utilizado system
función, por lo que utilizará otro shell para ejecutar el comando which which
. Desde 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 cambias which which
comando para echo $PATH
:
$ env -i ./a.out
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Si cambia su código para usar execve
en lugar de system
, obtendrá el resultado esperado:
#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;
}
Compílelo y ejecútelo:
$ gcc test.c && env -i ./a.out
got no path