我使用的是 macOS,我的 shell 是 zsh。預設情況下,我的系統的主目錄是/Users/njohn
.我創建了到該路徑的符號連結/usr/local/home
。我把HOME="/usr/local/home"
我的.zshrc
.我這樣做是為了首先,我可以快速地cd ..
從我的主目錄,並且我將位於/usr/local
我的所有自製程式包和設定檔所在的位置。這是一個非常簡單的快捷方式。我還喜歡能夠使用cd
並到達我的符號連結路徑,而不是普通路徑,它在檔案系統中距離我想要更接近的東西很遠。
這可能會破壞任何東西嗎?有沒有更安全或更好的方法可以完成相同的事情?
答案1
免責聲明:我沒有,也沒有使用過 MacOS,所以我不完全確定 Mac 和 *nix 之間可能存在什麼(如果有的話)不規則或細微的差異。
為了回答您的問題,我可以想像此設定的“破壞”的唯一情況是當給定程序嘗試對您的主目錄執行某些操作並且默認情況下它不遵循符號鏈接(或者由於某種原因根本不遵循) 。如果任何假設的程式嘗試讀取/寫入您的主目錄中的某些文件,並且它無法解析您的/usr/local/home
符號鏈接,則事情可能會中斷。儘管這種情況發生的可能性超出了我的範圍。
也就是說,我認為您最好採用一種不修改變數的方法$HOME
。在您啟動的每個互動式 shell 的生命週期中,將您的$HOME
變數更改為系統理解的主目錄之外的內容是醜陋的、駭客的,並且必然會導致微妙的問題。我將為您提供三種更好的選擇。
選項 1:放置更合適的符號鏈接
如果您想堅持使用符號鏈接,只需/usr/local
從您的主目錄創建一個符號鏈接,刪除/usr/local/home
您現在擁有的鏈接,然後$HOME
從您的.zshrc
.例如:
% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local
與您目前的情況類似,您可以從主目錄快速存取 /usr/local,但這樣您不需要更改$HOME
.
選項 2:命名目錄
由於您使用的是 Zsh,我建議使用命名目錄。而不是HOME=/usr/local/home
,請執行類似以下操作,並uloc
用您選擇的短名稱替換:
uloc=/usr/local
然後,就可以快速切換到這個目錄了從任何地方透過以下方式:
# With no special options set
% cd ~uloc
# Slightly shorter
% setopt cdable_vars
% cd uloc
# Even shorter
% setopt cdable_vars auto_cd
% uloc
如您所看到的,如果您有一個擴展為路徑的變量,cd
如果您在 Zsh 中添加一個字元作為前綴,則可以在 Zsh 中訪問它~
,類似於用作 的~user
快捷方式/home/user
。您可以擁有任意數量的命名目錄,這樣您就可以快速訪問任何您經常使用的目錄,而不僅僅是/usr/local
您的情況。
此cdable_vars
選項可讓您~
在使用時省略命名目錄cd
,這auto_cd
表示如果您輸入的「命令」實際上是目錄(命名或文字),Zsh 將自動cd
進入該目錄。將這兩者結合起來可以讓您快速存取所需的目錄不管你在哪。與之相反選項1,因為您不依賴符號鏈接,所以cd
ing 到這個命名目錄實際上會將您放入該目錄中,這樣pwd
就會返回/usr/local
而不返回/Users/njohn/uloc
。
選項 3:使用 CDPATH
此方法可以單獨使用,也可以與選項2。
您也可以使用$CDPATH
,它是一個特殊變量,類似於$PATH
保存目錄列表的變數。然而,與此不同的是,如果在當前目錄下找不到給定路徑,則$PATH
目錄$CDPATH
將用作給定相對路徑的「根」 。cd
為了進行演示,請考慮以下事項:
# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]
share
由於中沒有指定目錄~/foo
,Zsh 會查詢可能是子目錄的$CDPATH
位置。share
由於/usr/local
位於$CDPATH
,並且share
是 的子目錄/usr/local
,因此您可以cd share
從~/foo
.你也可以更深入;例如,如果stuff
是 的子目錄/usr/local/share
,您可以透過執行 來到達那裡cd share/stuff
。
筆記:與 Bash 不同,Zsh 將始終在當前目錄中查找前嘗試目錄$CDPATH
,除非a.
包含在$CDPATH
.在這種情況下,Zsh 嚴格遵守$CDPATH
.
這使您更加方便,因為正如您所說,您經常需要訪問自製程式包和配置,您可以cd
從任何地方進入這些子目錄之一,而不需要任何類型的前綴!
正如已經提到的,您可以將其與命名目錄結合。從我自己的點文件中提取一個範例:
ZSH=~/.zsh
cdpath=(~/.zsh)
# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]
進一步閱讀
我建議更加熟悉 Zsh 及其許多功能*。以下是您可以查看的一些手冊頁和其他主題:
symlink(7)
— 詳細描述符號連結以及它們如何互動。zshexpn(1)
、「靜態命名目錄」-解釋命名目錄,手冊頁的其餘部分描述了 Zsh 中的所有形式的擴充。zshparam(1)
, "PARAMETERS USED BY THE SHELL" — 包含特殊變數的描述cdpath
等zshoptions(1)
— 詳細介紹了透過內建控制 Zsh 行為的所有選項setopt
。包括cdable_vars
比auto_cd
此答案提供的更深入的解釋。