防止 print -P 替換環境變數
我在 zsh 中使用prompt pure作為我的提示。在內部,它用於
print -Pn ...
列印目前目錄。出於某種原因,如果我有一個與目前目錄開頭匹配的環境變數集,則該環境變數名稱將被替換到輸出中。例如,
> export SOME_DIR=/home/bschlenk/some/path > cd ~/some/path/deeper/nested/path > print -Pn %~ ~SOME_DIR/deeper/nested/path
如何防止它將隨機環境變數替換為恰好匹配的路徑?我希望它列印出目前路徑,用
/home/bschlenk
替換~
,但沒有其他替換。
從以下文件
%~
:如果它有一個命名目錄作為其前綴,則該部分被替換為 a
~
後跟目錄的名稱,但前提是結果比完整路徑短下面是對動態和靜態命名目錄的引用。您看到的是一個靜態命名目錄
~
如果 之後的文本是字元串 shell 參數的名稱,其值以 開頭,則也可以定義它們/
。因此,如果變數的
SOME_DIR
值為/home/bschlenk/some/path
then~SOME_DIR
是一個靜態命名目錄,其值為/home/bschlenk/some/path
. 提示擴展%~
看到/home/bschlenk/some/path
並將其縮寫為~SOME_DIR
.但這還不是全部。事實上,這個縮寫只有在
SOME_DIR
被使用“啟動”時才會出現~SOME_DIR
。這記錄在optionauto_name_dirs
下,它消除了預先啟動的需要,但預設關閉。任何設置為目錄絕對名稱的參數都會立即成為該目錄的名稱,將由
%~
和相關提示序列使用,並且在對以 開頭的單詞執行完成時可用~
。(否則,必須先在表單中使用參數~param
。)
%~
為替換而啟動的參數(以及在 之後完成~
)顯示為命名目錄雜湊表中的一個條目,您可以使用 列出該條目hash -d
。我們已經將這些部分放在一起以了解發生了什麼。你怎麼能解決你的問題?這取決於是什麼導致
SOME_DIR
被啟動。如果您
auto_name_dirs
打開了該選項,那麼顯然您應該將其關閉。如果您以前使用
~SOME_DIR
過,可以使用unhash -d SOME_DIR
這不是永久性的:如果您再次使用它會再次彈出
~SOME_DIR
。但是考慮到你可以在任何可以使用的$SOME_DIR
地方使用~SOME_DIR
,~SOME_DIR
這並不是一個非常有用的功能。如果您無法擺脫構成
SOME_DIR
命名目錄的原因,並且您想用$HOME
→來縮寫目前目錄~
,則可以手動實現此轉換。if [[ $PWD = $HOME ]]; then HPWD=\~ elif [[ $PWD = $HOME/* ]]; then HPWD=\~/${PWD#$HOME/} else HPWD=$PWD fi
然後使用
print -rn $HPWD
而不是print -Pn %~
.如果您無法阻止
SOME_DIR
成為命名目錄並且您無法更改使用的程式碼%~
,那麼它會變得更加棘手。您可以使用 清空目錄雜湊表hash -r
,但無法將其設為函式的本地(僅限於子shell)。