BASH поддерживает $PROMPT_COMMAND
переменную среды, которая определяет команду, выполняемую перед любым интерактивным приглашением первого уровня. Я ищу ZSH-эквивалент этого.
Документация говорит, что есть функция, которую precmd
я могу определить для достижения этой цели; однако я понятия не имею, как определить его из переменной среды.
Я рассмотрел передачу переменной среды, которая заставит ZSH прочитать файл, содержащий определение этой функции, но ZSH , похоже, не поддерживает такие вещи : он читает только глобальные файлы, а затем файлы для каждого пользователя. Я могу заменить их, но я не могу добавить к ним без изменения файлов, что я не могу сделать.
Итак, как мне определить хук предварительного запроса в ZSH через переменную окружения, как я бы использовал $PROMPT_COMMAND
в BASH?
источник
exit
иexec
, ок;)
)start() { eval "$@"; echo post-command-code }
а затем использовать zle-привязку для выполнения командной строки с помощьюstart
prepended?DEBUG
Ловушка хорошая находка, но вы все еще есть проблема , как определить его. Я еще раз расширил свой ответ, но я оставляю вам право написать свой собственный ответ относительно решения ловушки DEBUG.:)
Ответы:
Самый простой подход к эмуляции bash,
$PROMPT_COMMAND
который приходит мне в голову, - это использоватьprecmd
крючок, как вы уже поняли. Определите это каки вы можете сделать что-то подобное:
Обратите внимание на одинарные кавычки в этом примере, иначе они
$(date)
будут раскрыты слишком рано, то есть уже при определении,$PROMPT_COMMAND
а не при вызове перед приглашением.Если вы хотите сохранить (и не хотите изменять) существующее определение, вы можете использовать этот подход:
При этом
prmptcmd
функции выполняются после существующейprecmd()
функции.Наконец, вот способ, который подходит для использования в программном пакете, который не должен изменять пользовательские или системные файлы и не может вводить команды в интерактивном режиме.
Примером порождения сеанса bash может быть
Для появления Zsh вы можете использовать
что приводит
/program/dir/.zshrc
к источнику. В этом файлеprecmd()
ловушка может быть определена, как описано выше. Если вы хотите, чтобы пользовательские настройки дополнительно включалиsource $HOME/.zshrc
и т.д. в программу .zshrc, тоже. Эта настройка поддерживается, так как файлы за пределами каталога программы не изменяются.В качестве последнего дополнения, вот еще одно доказательство того, как приветствовать новичка. Используйте следующий код в вашем
/program/dir/.zshenv
конфигурационном файле rc:источник
.zshrc
? (3) Пример:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
выполняетсяfoo()
иbar()
в дополнение кprecmd()
.PROMPT_COMMAND="echo foo" bash
, верно? Это возможность для нереста ЗШ:ZDOTDIR=/program/dir zsh
. Затем/program/dir/.zshrc
запускается при запуске, где вы можете определить крюк precmd (). Если вы хотите, чтобы пользователь дополнительно включалsource $HOME/.zshrc
и т.д. в zshrc программы. Это должно быть легко поддерживать, поскольку никакие файлы вне директории программы не изменяются.Как утверждает @mypy, Zsh
precmd
работает аналогично BashPROMPT_COMMAND
.Вот пример, который работает для Bash или Zsh и не использует
eval
:Запустить из сценариев инициализации оболочки:
и:
Подсказки здесь - только примеры. Определенно можно делать гораздо более хитрые вещи.
Подробнее о настройке функций приглашения см. По адресу : http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd и http://www.gnu.org/software/bash/manual/bashref.html. # Печать-Подсказка .
Для получения подробной информации о расширении приглашений см. Http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html и http://www.gnu.org/software/bash/manual/bashref.html#Printing-a. -Повторный .
источник