Это не является возможностью ни одной из распространенных оболочек.
Последние версии ATT ksh имеют уникальную особенность среди оболочек, называемую функциями дисциплины. Вы можете выполнить собственный код при доступе к переменной, и если вы установите .sh.value
на другое значение, это значение будет использоваться вместо значения переменной.
function PATH.get { .sh.value=$PATH:/blabla/$RANDOM; }
Однако даже эта функция не поможет вам для PATH
, поскольку она срабатывает только тогда, когда переменная используется сценарием, а не при внутреннем использовании PATH
внутри оболочки.
Если вы хотите, чтобы это было для последнего элемента PATH, и вы используете bash или zsh, вы можете использовать их функцию «команда не найдена» для вызова пользовательского кода, если команда не найдена. В bash:
command_not_found_handle () {
command "/blabla/$RANDOM/$@"
}
В zsh:
command_not_found_handler () {
/blabla/$RANDOM/$1 "$@[2,$#]"
}
Кроме этих случаев, нет никакой функции оболочки, которая вам поможет.В любом случае никакая функция оболочки не поможет вам для программ, которые не запускаются оболочкой.
Вы можете использовать LD_PRELOAD
, чтобы переопределить библиотечные функции execlp
, execvp
и execvpe
, чтобы сделать что-то отличное от разделения ] PATH
на части, разделенные двоеточиями, и интерпретировать каждый из них как каталог. См.
Перенаправить дескриптор файла перед выполнением для примера LD_PRELOAD
.
В качестве альтернативы вы можете поместить запись PATH в файловую систему FUSE , которая реализует стековую файловую систему, которая делает данный путь соответствующим переменной, лежащей в основе каталога. Это будет работать для программ, которые просто вызывают execve
с каждым элементом PATH, пока один из них не сработает, но это запутает программы, которые сначала просматривают записи PATH в поисках существующих исполняемых файлов, а затем выполняют найденный.