GNU/Linux >> Tutoriales Linux >  >> Linux

En un entorno vacío, ¿cómo se encuentran los ejecutables?

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

Linux
  1. Cómo verificar qué módulos de Apache están habilitados/cargados en Linux

  2. ¿Cómo se interpretan los paréntesis en la línea de comandos?

  3. Cómo encontrar qué Shell está utilizando en Linux

  4. cuál:comando no encontrado

  5. ¿Cómo saber qué procesos están usando el espacio de intercambio en Linux?

Aquí le mostramos cómo averiguar qué entorno de escritorio está utilizando

Cómo encontrar qué versión de Linux está ejecutando

¿Cómo verificar qué funciones de SysRq están habilitadas?

Cómo obtener direcciones MAC de dispositivos que no están en la red

¿Cómo puedo verificar qué definiciones de terminal están disponibles?

Linux:¿cómo saber qué procesos están anclados a qué núcleo?