19

BASH поддерживает переменную среды $PROMPT_COMMAND которая определяет команду, выполняемую перед любым интерактивным приглашением первого уровня. Я ищу ZSH-эквивалент этого.

Документация говорит, что есть функция, precmd я могу определить для достижения этой цели ; однако я понятия не имею, как определить его из переменной среды.

Я рассмотрел передачу переменной среды, которая заставит ZSH прочитать файл, содержащий определение этой функции, но ZSH , похоже, не поддерживает такие вещи: он читает только глобальные файлы, а затем файлы для каждого пользователя. Я могу заменить их, но я не могу добавить к ним без изменения файлов, что я не могу сделать.

Итак, как мне определить хук предварительного запроса в ZSH через переменную окружения, как я бы использовал $PROMPT_COMMAND в BASH?

2 ответа2

18

Самый простой подход для эмуляции bash $PROMPT_COMMAND который приходит мне в голову, - это использовать крюк precmd , как вы уже поняли. Определите это как

precmd() { eval "$PROMPT_COMMAND" }

и вы можете сделать что-то подобное:

$ PROMPT_COMMAND='echo Hello, it is now $(date)'
Hello, it is now Mon, Mar 31, 2014 7:08:00 PM
$ whoami      
user
Hello, it is now Mon, Mar 31, 2014 7:08:21 PM     
$

Обратите внимание на одинарные кавычки в этом примере, иначе $(date) будет раскрыто слишком рано, т.е. уже при определении $PROMPT_COMMAND а не при вызове перед приглашением.


Если вы хотите сохранить (и не хотите изменять) существующее определение, вы можете использовать этот подход:

$ prmptcmd() { eval "$PROMPT_COMMAND" }
$ precmd_functions=(prmptcmd)

При этом функции prmptcmd выполняются после существующей функции precmd() .


Наконец, вот способ, который подходит для использования в программном пакете, который не должен изменять пользовательские или системные файлы и не может вводить команды в интерактивном режиме.

Примером порождения сеанса bash может быть

PROMPT_COMMAND="echo foo" bash

Для появления Zsh вы можете использовать

ZDOTDIR=/program/dir zsh

что вызывает /program/dir/.zshrc для поиска . В этом файле precmd() может быть определена, как описано выше. Если вы хотите, чтобы пользовательские настройки дополнительно включали source $HOME/.zshrc и т.д. В программу тоже .zshrc. Эта настройка поддерживается, так как файлы за пределами каталога программы не изменяются.


В качестве последнего дополнения, вот еще одно доказательство того, как приветствовать новичка. Используйте следующий код в /program/dir/.zshenv rc config:

echo define precmd, traps, etc.

autoload -Uz zsh-newuser-install

if [[ ! -e "$HOME/.zshrc" ]]; then
  zsh-newuser-install -f
  mv $ZDOTDIR/.zshrc $HOME/.zshrc
else
  builtin source $HOME/.zshrc
fi
3

Как @mypy государств, precmd ЗШ работает аналогично PROMPT_COMMAND Bash - .

Вот пример, который работает для Bash или Zsh и не использует eval:

## ~/myprompt.sh

# 'ZSH_VERSION' only defined in Zsh
# 'precmd' is a special function name known to Zsh

[ ${ZSH_VERSION} ] && precmd() { myprompt; }

# 'BASH_VERSION' only defined in Bash
# 'PROMPT_COMMAND' is a special environment variable name known to Bash

[ ${BASH_VERSION} ] && PROMPT_COMMAND=myprompt

# function called every time shell is about to draw prompt
myprompt() {
  if [ ${ZSH_VERSION} ]; then
    # Zsh prompt expansion syntax
    PS1='%{%F{red}%}%n%{%f%}@%{%F{red}%}%m %{%F{cyan}%}%~ %{%F{white}%}%# %{%f%}'
  elif [ ${BASH_VERSION} ]; then
    # Bash prompt expansion syntax
    PS1='\[\e[31m\]\u\[\e[0m\]@\[\e[31m\]\h \[\e[36m\]\w \[\e[37m\]\$ \[\e[0m\]'
  fi
}

Запустить из сценариев инициализации оболочки:

## ~/.bashrc
. ~/myprompt.sh

а также:

## ~/.zshrc
. ~/myprompt.sh

Подсказки здесь - только примеры. Определенно можно сделать много хитрых вещей.

Подробнее о настройке функций приглашения см. По адресу : 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. -Повторный.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .