GNU/Linux >> Tutoriels Linux >  >> Linux

Dans un environnement vide, comment trouve-t-on les exécutables ?

À 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

Linux
  1. Comment vérifier quels modules Apache sont activés/chargés sous Linux

  2. Comment savoir quelle distribution Linux vous utilisez ?

  3. lequel :commande introuvable

  4. Comment créer un fichier zip de taille minimale (vide), qui a 22B ?

  5. Comment trouver le chemin d'installation de git sous Mac ou Linux ?

Voici comment savoir quel environnement de bureau vous utilisez

Comment les parenthèses sont-elles interprétées sur la ligne de commande ?

Comment trouver le shell que vous utilisez sous Linux

Comment trouver la version de Linux que vous utilisez

Comment vérifier quels modules apache sont activés/installés ?

Comment vérifier quelles fonctions SysRq sont activées ?