zsh_history 文件有问题

nee*_*dle 3 command-history zsh macintosh xdg

我目前正在尝试通过关注此XDG BASE DIRECTORIES 网站来清理我的主目录。

为此,我已存储在我的~/.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"
Run Code Online (Sandbox Code Playgroud)

问题是,当 i 时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-zshzsh --version是5.8

Mar*_*ert 5

\n

我尝试echo $HISTFILE在文件末尾添加~/.zshenv,它给出了~/.local/state/zsh/history,这正是我想要的。但是,如果我echo $HISTFILE在终端中运行,它仍然给出~/.config/zsh/.zsh_history. 所以看来$HISTFILE中的集合~/.zshenv没有被使用

\n
\n

也许看起来是这样,但更有可能的是,它可能在以下一个(或多个!)文件中被覆盖,所有这些文件均由Zsh after ~/.zshenv获取,按照此处给出的顺序:

\n
/etc/zprofile\n$ZDOTDIR/.zprofile\n/etc/zshrc\n$ZDOTDIR/.zshrc\n/etc/zlogin\n$ZDOTDIR/.zlogin\n
Run Code Online (Sandbox Code Playgroud)\n

准确发现它被覆盖的最简单方法是启动 Zsh

\n
zsh --sourcetrace --verbose\n
Run Code Online (Sandbox Code Playgroud)\n

这会

\n
    \n
  • 在获取每个文件之前打印它(包括不是由 Zsh 直接获取的文件)并且
  • \n
  • 在评估每个命令(包括参数分配)之前打印它。
  • \n
\n
\n
\n

我觉得可行的解决方案是更改/etc/zprofile文件,但我不喜欢这样做,因为我认为每当我更新计算机软件时,所有这些文件都会被重置(我认为......)。

\n
\n

通常,除非您正在管理服务器,否则通常不应触摸/etc. 如果您不喜欢系统文件中发生的情况/etc/z*,您有两个选择:

\n
    \n
  • 要防止 Zsh 获取任何 /etc/z*文件,请以zsh -d.
  • \n
  • 为了防止 Zsh 获取除此之外的/etc/z*文件请将其添加到您的./etc/zshenvsetopt NO_globalrcs~/.zshenv
  • \n
\n
\n

我还想知道/etc/zprofile,,,/etc/zshrc... 文件在更新计算机软件时是否确实会重置...

\n
\n

每当你更新 macOS 时,它们确实会被重置。在其他系统上,每当您更新 Zsh 软件包时,它们可能会或可能不会重置。它取决于\xe2\x84\xa2 包的管理方式。

\n
\n

顺便说一句,请注意,~/.zshenv每个新 shell(包括非交互式 shell)都会获取该信息。相反,Zsh$ZDOTDIR/.zprofile仅为登录 shell 提供源,而$ZDOTDIR/.zshrc另一方面,Zsh 为每个交互式shell 提供源。

\n

每当您打开新窗口或选项卡时,Apple\xe2\x80\x99s Terminal.app 都会启动登录 shell。然而,大多数 Linux 终端不会以这种方式启动登录 shell,除非您将它们配置为这样做。如果您希望 Zsh 点文件是可移植的,那么最好假设 Zsh 仅在 macOS 上作为登录 shell 启动。

\n

鉴于这些信息,我建议您重新组织全局变量分配,如下所示:

\n

$HOME/.zshenv:

\n
# No need to export anything here, as .zshenv is sourced for \n# _every_ shell (unless invoked with `zsh -f`).\n\n# Assign these only if they don\'t have value yet. \n: ${XDG_CONFIG_HOME:=$HOME/.config}\n: ${XDG_STATE_HOME:=~/.local/state}\n\n# Set $ZDOTDIR here to be able to store your other Zsh dotfiles \n# outside of $HOME. \nZDOTDIR=$XDG_CONFIG_HOME/zsh\n
Run Code Online (Sandbox Code Playgroud)\n

$ZDOTDIR/.zprofile:

\n
# The following have to go in .zprofile, because they are used by \n# macOS\'s /etc/zshrc file, which is sourced _before_ your`.zshrc` \n# file.\nexport SHELL_SESSION_DIR=$XDG_STATE_HOME/zsh/sessions\nexport SHELL_SESSION_FILE=$SHELL_SESSION_DIR/$TERM_SESSION_ID\n
Run Code Online (Sandbox Code Playgroud)\n

$ZDOTDIR/.zshrc:

\n
# The following have to go in .zprofile, because they are used by \n# macOS\'s /etc/zshrc file, which is sourced _before_ your`.zshrc` \n# file.\nexport SHELL_SESSION_DIR=$XDG_STATE_HOME/zsh/sessions\nexport SHELL_SESSION_FILE=$SHELL_SESSION_DIR/$TERM_SESSION_ID\n
Run Code Online (Sandbox Code Playgroud)\n