BASH의 $ PROMPT_COMMAND에 해당하는 ZSH는 무엇입니까?


22

BASH는 $PROMPT_COMMAND첫 번째 수준의 대화식 프롬프트 전에 실행할 명령을 정의 하는 환경 변수를 지원 합니다. 나는 이것과 동등한 ZSH를 찾고 있습니다.

문서 는 그것을 precmd달성하기 위해 정의 할 수 있는 기능이 있다고 말합니다 . 그러나 환경 변수에서 정의하는 방법을 모르겠습니다.

ZSH가 해당 함수의 정의가 포함 된 파일을 읽을 수 있도록 환경 변수를 전달하는 것을 고려했지만 ZSH 이러한 기능 을 지원하지 않는 것 같습니다 . 전역 파일 만 읽은 다음 사용자 별 파일 만 읽습니다. 파일을 바꿀 수는 있지만 파일을 수정하지 않고는 추가 할 수 없습니다.

$PROMPT_COMMANDBASH에서 사용하는 것처럼 환경 변수를 통해 ZSH에서 사전 프롬프트 후크를 어떻게 정의 합니까?


사실, 대화 형 명령 실행 후 후크가 필요하지만 어느 쉘도 하나를 제공하지 않으므로 미리 프롬프트 된 후크에 의지해야합니다. 가능한 한 가깝습니다.
Shnatsel

1
흠, 대화식 명령 실행프롬프트사전 프롬프트 의 차이점이 무엇인지 궁금 합니다 . 개념적 차이 외에 실제로 차이를 관찰하는 위치는 무엇입니까? (의이 명령을 생략하자 exitexec확인 ;))
MPY

@mpy 백그라운드 작업은 프롬프트 순서와 무관하므로 백그라운드 작업을 실행할 때 차이가 있습니다.
Shnatsel

1
좋아, 나는 그 점을 얻었다. 그렇다면 어떻게 해야할까요? start() { eval "$@"; echo post-command-code }그런 다음 zle-binding을 사용하여 명령 줄을 start앞에 붙여서 실행하십시오 .
mpy

1
DEBUG트랩 좋은 발견,하지만 당신은 여전히 방법을 정의하는 문제가있다. 답변을 한 번 더 확장했지만 DEBUG 트랩 솔루션에 대한 답변을 직접 작성해 드리겠습니다. :)
mpy

답변:


20

$PROMPT_COMMAND내 마음에 오는 bash를 에뮬레이트하는 가장 간단한 방법 은 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/.zshenvrc 설정 파일 에서 다음 코드를 사용하십시오 :

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

나는 그렇게 많이 생각했다. 문제는-환경 변수를 통해 precmd 훅을 어떻게 정의합니까? 파일을 수정하지 않고 후크 나 코드를 추가하는 메커니즘이 있습니까? 아니면 전역 및 사용자 전역 ".zprofile"및 유사한 파일에 쓰지 않고 어떻게해야합니까? 예를 들어, 기존 .zprofile을 추가하여 기존 파일을 대체하지 않습니까?
Shnatsel

1
또한 여기서 precmd hook을 사용하면 기존의 precmd hook이 대체됩니다. zsh docs는 공존 할 함수 배열을 만들 수 있다고 말하지만 어떻게 해야할지 모르겠습니다.
Shnatsel

1
(1) 환경 변수를 통해 precmd 훅을 어떻게 정의합니까? 내가 제시 한 예는 bash 메커니즘과 같은 IMHO 작품입니다. (2) 명령 줄을 통해 후크를 추가 할 수는 있지만 영구적이지 않습니다. 귀하의 수정에 어떤 문제가 .zshrc있습니까? (3) 예 : foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)이 실행 foo()하고 bar() 또한precmd().
mpy

2
좋아, 그것은 많은 것을 명확히한다. bash의 최소한의 예는 맞을까 PROMPT_COMMAND="echo foo" bash? 이 산란 zsh을위한 가능성이다 ZDOTDIR=/program/dir zsh. 그런 다음 /program/dir/.zshrc시작시 precmd () 후크를 정의 할 수 있습니다. 사용자가 원하는 경우 source $HOME/.zshrc프로그램의 zshrc에 등을 포함 하십시오. 프로그램 디렉토리 외부의 파일은 수정되지 않으므로 유지 관리가 쉬워야합니다.
mpy

1
@ Shnatsel : 나는 대답을 확장했다. 의견의 추가 정보를 포함하도록 질문을 편집 할 수도 있습니다.
mpy

4

@mypy가 말했듯이 Zsh precmd는 Bash와 유사하게 작동합니다 PROMPT_COMMAND.

다음은 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-precmdhttp://www.gnu.org/software/bash/manual/bashref.html을 참조하십시오. # 프린팅-프롬프트 .

프롬프트 확장에 대한 자세한 내용은 http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.htmlhttp://www.gnu.org/software/bash/manual/bashref.html#Printing-a를 참조하십시오 . 프롬프트 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.