
現在、次のようにホームディレクトリを整理しようとしています。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-zsh
5.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/zshenv
、setopt 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
答え2
これらのユーザー設定を処理するのは仕事ではありません~/.zshenv
。~/.zshrc
後でシステムデフォルトを適用したくない場合は、envの代わりにrcファイルを編集してみてください。
私はenvで私のzsh設定ファイルに完全に異なる場所を適用します(つまり、〜ではありません)。次に、ログイン時にのみインポートしたいのか、それともアクセスするたびにインポートしたいかに応じて、プロファイルとrcに特定の設定を作成します。対話型セッションが開きます。
順序が重要です。乾杯!