Можно ли «прослушать» значение переменной при запуске новой оболочки?
У меня есть сценарий, который проверяет переменную $ PATH в типичных местах, но я бы хотел попробовать что-нибудь другое. Вот что я думаю:
Вместо того, чтобы просто гадать, где установлен $ PATH, я хотел бы создать новую оболочку для пользователя в фоновом режиме, выполнив команду, которая называется что-то вроде «path-Inspector». path-Inspector порождает новую оболочку для текущего пользователя и слушает переменную $ PATH. Возможно, он сначала устанавливает $ PATH в пустую строку, но каждый раз, когда $ PATH изменяется, команда выводит имя файла с номером строки, которая изменила $ PATH. Это было бы похоже на установку точек останова и наличие отладчика специально для $ PATH.
Я все еще чувствую, что нахожусь на той стадии, когда я не знаю, у меня есть четкое представление о том, как это можно реализовать. Вот то, что я знаю, и мне нужно было бы заняться:
Я открыт для любых отзывов: «Это уже сделано», «Это невозможно» или «вам также нужно знать об этом». и т.п.
ksh
на самом деле реализует изящную функцию, называемую discipline functions
который в основном позволяет вам прикреплять обратные вызовы к настройке или ссылке на переменную:
$ cat t.sh
#!/bin/ksh
PATH=
function PATH.set
{
echo "new PATH in ${.sh.file}:${.sh.lineno}:"
echo " old = [${PATH}]"
echo " new = [${.sh.value}]"
}
PATH=/bin:/usr/bin:/sbin:/usr/sbin
PATH=$PATH:$PATH
.
$ ./t.sh
new PATH in t.sh:12:
old = []
new = [/bin:/usr/bin:/sbin:/usr/sbin]
new PATH in t.sh:13:
old = [/bin:/usr/bin:/sbin:/usr/sbin]
new = [/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin:/sbin:/usr/sbin]
Так же, PATH.get
будет выполняться каждый раз $PATH
упоминается.
К сожалению, как кажется, вы не можете экспортировать функции в ksh93
, это ограничит обратный вызов текущим скриптом, что ограничит его общую полезность.