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-zsh
,zsh --version
是5.8
\n\n我尝试
\necho $HISTFILE
在文件末尾添加~/.zshenv
,它给出了~/.local/state/zsh/history
,这正是我想要的。但是,如果我echo $HISTFILE
在终端中运行,它仍然给出~/.config/zsh/.zsh_history
. 所以看来$HISTFILE
中的集合~/.zshenv
没有被使用
也许看起来是这样,但更有可能的是,它可能在以下一个(或多个!)文件中被覆盖,所有这些文件均由Zsh after ~/.zshenv
获取,按照此处给出的顺序:
/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
\nzsh --sourcetrace --verbose\n
Run Code Online (Sandbox Code Playgroud)\n这会
\n\n\n我觉得可行的解决方案是更改
\n/etc/zprofile
文件,但我不喜欢这样做,因为我认为每当我更新计算机软件时,所有这些文件都会被重置(我认为......)。
通常,除非您正在管理服务器,否则通常不应触摸/etc
. 如果您不喜欢系统文件中发生的情况/etc/z*
,您有两个选择:
/etc/z*
文件,请以zsh -d
./etc/z*
文件,请将其添加到您的./etc/zshenv
setopt NO_globalrcs
~/.zshenv
\n\n我还想知道
\n/etc/zprofile
,,,/etc/zshrc
... 文件在更新计算机软件时是否确实会重置...
每当你更新 macOS 时,它们确实会被重置。在其他系统上,每当您更新 Zsh 软件包时,它们可能会或可能不会重置。它取决于\xe2\x84\xa2 包的管理方式。
\n顺便说一句,请注意,~/.zshenv
每个新 shell(包括非交互式 shell)都会获取该信息。相反,Zsh$ZDOTDIR/.zprofile
仅为登录 shell 提供源,而$ZDOTDIR/.zshrc
另一方面,Zsh 为每个交互式shell 提供源。
每当您打开新窗口或选项卡时,Apple\xe2\x80\x99s Terminal.app 都会启动登录 shell。然而,大多数 Linux 终端不会以这种方式启动登录 shell,除非您将它们配置为这样做。如果您希望 Zsh 点文件是可移植的,那么最好假设 Zsh 仅在 macOS 上作为登录 shell 启动。
\n鉴于这些信息,我建议您重新组织全局变量分配,如下所示:
\n$HOME/.zshenv
:
# 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
:
# 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
:
# 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