Узнайте, какие переменные среды используются командой - PullRequest
7 голосов
/ 13 декабря 2011

в среде Linux (в моем случае XUbuntu), есть ли способ узнать, к каким переменным среды обращается команда, запускаемая из консоли?

Должна быть возможность узнать оэти переменные, так как кто-то должен предоставить значения для программы.Но есть ли какой-нибудь метод по умолчанию для этого?

Здесь речь идет о программе xprintidle.

Заранее спасибо, Йост

Ответы [ 4 ]

8 голосов
/ 13 декабря 2011

Если вы хотите, чтобы переменные действительно использовались каким-то процессом, выполняющим команду, вы можете использовать ltrace и искать вызовы getenv :

$ ltrace -e getenv ./your_program

Конечно, аргумент getenv может быть вычислен (поэтому вы не можете его предсказать).

Однако некоторые (старые или странные) приложения могут использовать глобальный environ или третий необязательный аргумент для main; а некоторые приложения даже меняют свою среду, используя putenv , setenv или unsetenv (все 3 функции libc, а не встроенная оболочка).

но xprintidle в основном взаимодействует с сервером Xorg. Я удивлен, что вы ожидаете, что он будет использовать много переменных окружения (кроме DISPLAY).

3 голосов
/ 13 декабря 2011

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

Для определенной среды вы можете использовать:

perl -pe 's,\00,\n,g' /proc/xxxx/environ

где xxxx - PID вашего процесса.

Для переменных, к которым вы обращаетесь, вам нужно использовать что-то вроде ltrace и проверять вызовы getenv().

0 голосов
/ 13 декабря 2011

Вы можете посмотреть переменные среды, которые передаются вашей программе, с помощью команды printenv.

Один из способов, с помощью которого программы могут взглянуть на свое окружение, - это использовать вызов getenv, так что вы можете использовать программу трассировки или трюк LD_PRELOAD, чтобы обернуть этот вызов и выяснить, что они ищут.

Однако не все программы используют getenv для просмотра своей среды. Если программа использует следующий (необычный) формат для main, она может просматривать переменные среды через указатель envp:

int main(int argc, char *argv[], char *envp[]) {
    /* ... */
}

Кроме того, программы могут получить доступ к среде через переменную environ.

Вероятно, вам повезет, если вы будете отслеживать вызовы getenv, но это не гарантия - она ​​варьируется от программы к программе.

0 голосов
/ 13 декабря 2011

Если вам нужен список переменных среды, то это делается с помощью env

Но определить, к каким переменным обращается программа, невозможно, поскольку все они передаются как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...