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