GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie werden ausführbare Dateien in einer leeren Umgebung gefunden?

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ühre
env -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

Linux
  1. So überprüfen Sie, welche Apache-Module in Linux aktiviert/geladen sind

  2. Woher wissen Sie, welche Linux-Distribution Sie verwenden?

  3. So beheben Sie einen Befehl nicht gefunden-Fehler in Linux

  4. Wie werden Klammern in der Befehlszeile interpretiert?

  5. Wie erstelle ich eine (leere) Zip-Datei mit minimaler Größe, die 22B hat?

So finden Sie heraus, welche Desktop-Umgebung Sie verwenden

So finden Sie heraus, welche Linux-Version Sie ausführen

Wie kann ich den $PATH unter Linux bearbeiten?

So erhalten Sie MAC-Adressen von Geräten, die sich nicht im Netzwerk befinden

Wie kann ich überprüfen, welche Terminaldefinitionen verfügbar sind?

Linux:Woher wissen, welche Prozesse an welchen Kern geheftet sind?