В пустой среде, как исполняемые файлы найдены?

awk -F, '!seen[$1]++'

$1 первый столбец, изменение как соответствующий; можно использовать несколько столбцов, разделенных запятыми ([$1,$3]), или $0 для целой строки.

7
20.04.2014, 00:15
2 ответа

Вы использовали системную функцию , поэтому она будет использовать другую оболочку для выполнения команды , которая . Из 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.

Если вы измените which команду на echo $ PATH :

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

Если вы измените свой код на использование execve вместо системы вы получите ожидаемый результат:

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

Скомпилируйте и запустите ее:

$ gcc test.c && env -i ./a.out 
got no path
11
27.01.2020, 20:15

В пустом окружении исполняемые файлы не найдены, если не указан полный путь. Попробуйте это сделать с помощью execvp.

Функция system вызывает оболочку - в Linux с Glibc она вызывает /bin/sh (поэтому не требуется PATH). Оболочки определяют несколько собственных переменных в дополнение к тем, которые поступают из окружения. Вы можете увидеть, что они определяют, выполнив env -i /path/to/shell -c set, и какие переменные они экспортируют, выполнив env -i /path/to/shell -c export. В частности, dash и bash - две оболочки, которые вы, скорее всего, найдете как /bin/sh в Linux - устанавливают (но не экспортируют) PATH во "вменяемое" значение по умолчанию, если в окружении его нет. Разные оболочки устанавливают разные значения или не устанавливают их вообще.

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ env -i dash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ env -i mksh -c 'echo $PATH'
/usr/bin:/bin
$ env -i ksh93 -c 'echo $PATH'

$ env -i zsh -c 'echo $PATH' 
/bin:/usr/bin:/usr/ucb:/usr/local/bin
$ env -i csh -c 'echo $PATH' 
PATH: Undefined variable.
$ env -i tcsh -c 'echo $PATH'
PATH: Undefined variable.

На моей машине (и на вашей, видимо), which сам по себе является /bin/sh скриптом. Оболочка, вызываемая system, использует свою собственную переменную пути, чтобы найти программу which, но не экспортирует ее. Оболочка, которая сама запускает сценарий which, также определяет переменную PATH для своего внутреннего использования.

3
27.01.2020, 20:15

Теги

Похожие вопросы