zsh_historyファイルに問題があります

zsh_historyファイルに問題があります

現在、次のようにホームディレクトリを整理しようとしています。XDG基本ディレクトリウェブサイト

そのために、私は以下を保存しました~/.zshenv

# ---- Default editors ---- #
export EDITOR="nvim"
export VISUAL="nvim"

# ---- XDG BASE DIRECTORY ---- #
# https://wiki.archlinux.org/title/XDG_Base_Directory
export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"}
export XDG_CACHE_HOME=${XDG_CACHE_HOME:="$HOME/.cache"}
export XDG_DATA_HOME=${XDG_DATA_HOME:="$HOME/.local/share"}
export XDG_STATE_HOME=${XDG_STATE_HOME:="$HOME/.local/state"}

# ---- ZSH ---- #
export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
export HISTFILE="$XDG_STATE_HOME/zsh/history"
export SHELL_SESSION_DIR="$XDG_STATE_HOME/zsh/sessions"
export SHELL_SESSION_FILE="$SHELL_SESSION_DIR/$TERM_SESSION_ID"

問題は、私が望むものと一致しないことをecho $HISTFILE与えるということです。~/.config/zsh/.zsh_history$XDG_STATE_HOME/zsh/history

echo $HISTFILEファイルの最後に追加しようとしましたが、正確に私が欲しいものを提供します~/.zshenv~/.local/state/zsh/historyしかし、端末で実行すると、echo $HISTFILEまだ~/.config/zsh/.zsh_history$HISTFILE~/.zshenv理由と解決策がわかりません。

私の考えに効果があると思われる解決策は、ファイルを変更することです/etc/zprofile。しかし、私はコンピュータソフトウェアを更新するたびにすべてのファイルがリセットされると思うので、そうするのは好きではありません(私の考えでは...)。そうでない場合はそこから修正して$HISTFILE

しかし、より良い解決策がある場合は、助けてください/etc/zprofile/etc/zshrc

ちなみに私は書いたことがないのにoh-my-zsh5.8zsh --versionです

ベストアンサー1

echo $HISTFILEファイルの最後に追加しようとしましたが、正確に私が欲しいものを提供します~/.zshenv~/.local/state/zsh/historyしかし、端末で実行すると、echo $HISTFILEまだ~/.config/zsh/.zsh_history$HISTFILE~/.zshenv

たぶんそれはそう見えるかもしれませんが、おそらく次のファイルの1つ(またはそれ以上!)で上書きされている可能性があります。ソース:Zsh後ろに ~/.zshenv、ここで指定された順序で:

/etc/zprofile
$ZDOTDIR/.zprofile
/etc/zshrc
$ZDOTDIR/.zshrc
/etc/zlogin
$ZDOTDIR/.zlogin

上書きした場所を正確に見つけるには、最も簡単な方法はZshを起動することです。

zsh --sourcetrace --verbose

これは

  • インポートする前に各ファイルを印刷します(Zshから直接インポートされなかったファイルを含む)。
  • 評価される前に各コマンド(パラメータ割り当てを含む)を印刷します。

私の考えに効果があると思われる解決策は、ファイルを変更することです/etc/zprofile。しかし、私はコンピュータソフトウェアを更新するたびにすべてのファイルがリセットされると思うので、そうするのは好きではありません(私の考えでは...)。

サーバーを管理していない限り、通常この部分に触れないでください/etc。システムファイルに発生する状況が気に入らない場合は、次の/etc/z*2つのオプションがあります。

  • Zsh購入防止どの /etc/z*ファイル、zsh -d
  • /etc/z*Zshがファイルをインポートしないようにする/etc/zshenvsetopt NO_globalrcsに追加してください~/.zshenv

/etc/zprofileコンピュータソフトウェアを更新するとき、、、、/etc/zshrc...ファイルがリセットされるかも知りたいのですが...

macOSをアップデートするたびにリセットされます。他のシステムでは、Zshパッケージを更新するたびにリセットまたはリセットされないことがあります。これはパッケージの管理方法によって異なります。


ちなみに、~/.zshenvすべての新しいケースはソースがあることに注意してください。非対話型シェルを含みます。対照的に、Zshは$ZDOTDIR/.zprofileログインシェルのソースのみを提供しますが$ZDOTDIR/.zshrc、Zshはすべてのログインシェルのソースを提供します。インタラクティブシェル。

AppleのTerminal.appは、新しいウィンドウまたはタブを開くたびにログインシェルを実行します。ただし、ほとんどのLinux端末は、ユーザーが設定しない限り、このようにログインシェルを起動しません。 Zshドットファイルを移植可能にするには、ZshがmacOSからログインシェルとしてのみ実行されると仮定するのが最善です。

この情報に基づいて、グローバル変数の割り当てを次のように再構成することをお勧めします。

$HOME/.zshenv:

# No need to export anything here, as .zshenv is sourced for 
# _every_ shell (unless invoked with `zsh -f`).

# Assign these only if they don't have value yet. 
: ${XDG_CONFIG_HOME:=$HOME/.config}
: ${XDG_STATE_HOME:=~/.local/state}

# Set $ZDOTDIR here to be able to store your other Zsh dotfiles 
# outside of $HOME. 
ZDOTDIR=$XDG_CONFIG_HOME/zsh

$ZDOTDIR/.zprofile:

# The following have to go in .zprofile, because they are used by 
# macOS's /etc/zshrc file, which is sourced _before_ your`.zshrc` 
# file.
export SHELL_SESSION_DIR=$XDG_STATE_HOME/zsh/sessions
export SHELL_SESSION_FILE=$SHELL_SESSION_DIR/$TERM_SESSION_ID

$ZDOTDIR/.zshrc:

# HISTFILE is used by interactive shells only. Plus, 
# non-interactive shells & external commands don't need this var. 
# Hence, we put it in your .zshrc file, since that's sourced for 
# each interactive shell, and don't export it.
HISTFILE=$XDG_STATE_HOME/zsh/history

# Only vars used by external commands or non-interactive sub 
# shells need to be exported. Note that you can export vars 
# without assigning values to them.
export XDG_CONFIG_HOME XDG_STATE_HOME
export XDG_CACHE_HOME=~/.cache
export XDG_DATA_HOME=~/.local/share
export EDITOR=nvim VISUAL=nvim

おすすめ記事