web-dev-qa-db-ja.com

BASHの$ Prompt_COMMANDに相当するZSHは何ですか?

BASHは、第1レベルの対話型プロンプトの前に実行されるコマンドを定義する$Prompt_COMMAND環境変数をサポートしています。それと同等のZSHを探しています。

ドキュメント は、それを達成するために定義できる関数precmdがあると言います。ただし、環境変数から定義する方法はわかりません。

ZSHにその関数の定義を含むファイルを読み取らせる環境変数を渡すことを検討しましたが、ZSH そのようなことをサポートしていないようです :グローバルファイルのみを読み取ってからユーザーごとにファイル。それらを置き換えることはできますが、ファイルを変更せずに追加することはできません。

では、BASHで$Prompt_COMMANDを使用する場合と同様に、環境変数を介してZSHでプロンプト前フックを定義するにはどうすればよいですか?

27
Shnatsel

あなたがすでに理解しているように、私の頭に浮かぶ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()フックを定義できます。ユーザーの設定が必要な場合さらにプログラムの.zshrcにも_source $HOME/.zshrc_などを含めます。プログラムディレクトリ外のファイルは変更されないため、この設定は維持できます。


最後の追加として、これも新しいユーザーを歓迎し続ける方法の概念の証明です。 _/program/dir/.zshenv_ rc構成ファイルで次のコードを使用します。

_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
_
26
mpy

@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
}

シェルのinitスクリプトから実行します。

## ~/.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#Printing-a-Prompt

プロンプト拡張の詳細については、 http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html および http://www.gnu.org/software/を参照してください。 bash/manual/bashref.html#Printing-a-Prompt

5
jwfearn