GNU/Linux >> Znalost Linux >  >> Linux

Jak se v prázdném prostředí nacházejí spustitelné soubory?

Pro účely experimentování jsem vytvořil binární soubor, který vypíše $PATH a volá which takto:

#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;
}

když jej spustím v prázdném prostředí přes

env -i ./printpath

Dostávám následující výtisk:

got no path
/usr/bin/which

Moje otázka zní:proč je správný which binárně volané, i když neexistuje $PATH ?

Přijatá odpověď:

Použili jste system funkce, takže ke spuštění příkazu which použije jiný shell . Z 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.

Pokud změníte which which příkaz k echo $PATH :

$ env -i ./a.out 
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Pokud změníte kód tak, aby používal execve místo system , dostanete očekávaný výstup:

#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;                                                                   
} 

Zkompilujte a spusťte jej:

$ gcc test.c && env -i ./a.out 
got no path

Linux
  1. který:příkaz nenalezen

  2. Jak zjistit, které procesy využívají swapovací prostor v Linuxu?

  3. Jak vytvořit minimální velikost (prázdný) zip soubor, který má 22B?

  1. Jak najít instalační cestu git v Mac nebo Linuxu?

  2. který python vs PYTHONPATH

  3. Jak zkontrolovat, které moduly Apache jsou povoleny/nainstalované?

  1. Jak zkontrolovat, které funkce SysRq jsou povoleny?

  2. Jak mohu upravit $PATH na linuxu?

  3. Linux:jak zjistit, které procesy jsou připojeny ke kterému jádru?