我目前正在尝试按照以下方式清理我的主目录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"
问题是,当 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
答案1
我尝试
echo $HISTFILE
在文件末尾添加~/.zshenv
,它给出了~/.local/state/zsh/history
,这正是我想要的。但是,如果我echo $HISTFILE
在终端中运行,它仍然给出~/.config/zsh/.zsh_history
.所以看来$HISTFILE
中的集合~/.zshenv
没有被使用
也许看起来是这样,但更有可能的是,它可能在以下一个(或多个!)文件中被覆盖,所有这些文件都是来源:Zsh后 ~/.zshenv
,按照此处给出的顺序:
/etc/zprofile
$ZDOTDIR/.zprofile
/etc/zshrc
$ZDOTDIR/.zshrc
/etc/zlogin
$ZDOTDIR/.zlogin
要准确发现它被覆盖的位置,最简单的方法是启动 Zsh
zsh --sourcetrace --verbose
这会
- 在获取每个文件之前打印它(包括不是由 Zsh 直接获取的文件)并且
- 在评估每个命令(包括参数分配)之前打印它。
我觉得可行的解决方案是更改文件
/etc/zprofile
,但我不喜欢这样做,因为我认为每当我更新计算机软件时,所有这些文件都会被重置(我认为......)。
通常,除非您正在管理服务器,否则通常不应触摸/etc
.如果您不喜欢系统/etc/z*
文件中发生的情况,您有两个选择:
- 防止 Zsh 采购任何
/etc/z*
文件,以zsh -d
. - 防止 Zsh 获取
/etc/z*
文件以外/etc/zshenv
,添加setopt NO_globalrcs
至您的~/.zshenv
。
我还想知道
/etc/zprofile
,,,/etc/zshrc
... 文件在更新计算机软件时是否确实会重置...
每当你更新 macOS 时,它们确实会被重置。在其他系统上,每当您更新 Zsh 软件包时,它们可能会或可能不会重置。这取决于™ 包的管理方式。
顺便说一句,请注意,~/.zshenv
每个新外壳都会采购,包括非交互式 shell。相反,Zsh$ZDOTDIR/.zprofile
仅提供登录 shell 的源,而$ZDOTDIR/.zshrc
另一方面,Zsh 提供每个登录 shell 的源。交互的壳。
每当您打开新窗口或选项卡时,Apple 的 Terminal.app 都会启动登录 shell。然而,大多数 Linux 终端不会以这种方式启动登录 shell,除非您将它们配置为这样做。如果您希望 Zsh 点文件是可移植的,那么最好假设 Zsh 仅在 macOS 上作为登录 shell 启动。
鉴于这些信息,我建议您重新组织全局变量分配,如下所示:
$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
答案2
处理这些用户偏好不是~/.zshenv
的工作,~/.zshrc
而是
尝试编辑 rc 文件而不是 env 以避免事后应用系统默认值。
我自己在 env 中为我的 zsh 设置文件应用了一个完全不同的位置(即,不是 ~),但然后在 profile 和 rc 中写入这些特定设置,具体取决于我是否希望它们仅在登录时获取或每次打开新的交互式会话时获取。
顺序很重要。干杯!