Способ определения, где настроен определенный глобальный параметр

Способ определения, где настроен определенный глобальный параметр

Возможный дубликат:
Как определить, откуда взялась переменная окружения

Интересно, есть ли способ определить местоположение файла, в котором существует определенная конфигурация. Например, знаю, что у меня есть глобальный параметр TMOUT, и хочу его изменить, но не знаю, ГДЕ он настроен. Я знаюэтотвопрос, который уже задавался здесь, однако я хотел бы узнать, есть ли какой-либо другой способ, кроме исследования порядка появления переменных в соответствии с командой env.

решение1

Выполнение этой команды займет много времени (так как она проверит все файлы в системе), но она должна найти файл:

find / -type f -print0 | xargs -0 grep -w 'TMOUT=' /dev/null

Альтернативный подход заключается в том, чтобы выяснить, при каких обстоятельствах он устанавливается, например, проверив, установлен ли он, когда оболочка не является оболочкой входа ( env -i bash) и установлена ​​ли она ( env -i bash --login). Вы можете вручную проверить файлы в $HOME, например .profile, .env, .bashrcили .bash_profile. Также есть некоторые файлы, в /etc/которых указаны переменные среды; он может быть установлен в любом из них.

Если ваша оболочка входа — ksh, вы обнаружите, что $TMOUTэто установлено самой оболочкой ksh.


Редактировать:чтобы объяснить некоторые менее очевидные особенности командной строки выше:

Идиома find ... -print0 | xargs -0 ...довольно распространена. Смысл использования -print0вместо значения по умолчанию -printв том, что имена файлов завершаются ASCII NUL в случае -print0. Это означает, что имена файлов, содержащие фактический символ новой строки, будут представлены правильно. Передача -0параметра xargsпросто заставляет xargsпонять то же соглашение.

Практика обычной передачи /dev/nullв качестве первого аргумента grepтакже заслуживает пояснения. Поскольку вы получаете только конец файла при чтении из /dev/null, он никогда не будет соответствовать любой непустой строке с grep. Следовательно, для этого файла не будет никаких попаданий. Мы указываем его только в командной строке grep, чтобы правильно справиться со случаем, когда в последний раз xargsзапускается grep, остается только один файл для поиска. Если grep имеет только один аргумент file, он перечисляет попадания без указания командной строки. Вот так:

~/tmp/t$ echo hello > a
~/tmp/t$ echo hi > b
~/tmp/t$ grep '^h.*' a
hello
~/tmp/t$ grep '^h.*' a b
a:hello
b:hi

решение2

Хотя это и не точный ответ на ваш вопрос, но он может дать ответ на часть вашего вопроса.

StackOverflow: Linux: где хранятся переменные среды?

РЕДАКТИРОВАТЬ:

При отладке моих скриптов оболочки я обычно добавляю -x. #!/bin/bash -x Вы также можете попробовать запустить его из оболочки какbash -x

# su - test

    test$ bash -x
     unset a r
    + . /etc/bash_completion.d/yast2-completion.sh
       **(file sourced)**
    ++ YAST=/sbin/yast
    ++ YAST_MODLIST=()
       **(variables set from file)**
       #....
    ++ /usr/bin/dircolors -b /etc/DIR_COLORS
    + eval 'LS_COLORS='\''no=00
       #....

Связанный контент