Назад | Перейти на главную страницу

Проверка того, как создается $ PATH

Можно ли «прослушать» значение переменной при запуске новой оболочки?

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