在不同的物理驅動器上執行符號連結
我的硬碟上有一個文件夾,裡面
/media/kalenpw/HDD/Documents/ShellScripts
裝滿了我想從任何目錄訪問的各種腳本。我以前的策略是將所有文件複製到/usr/local/bin
這個工作中,但是在更新必須在兩個地方更改的腳本時很乏味。幸運的是,我最近了解了符號連結,它們非常適合。
我在我的主文件夾中製作了一個測試腳本
test.sh
print "Hello"
然後我做到了
ln ~/test.sh /usr/local/bin
,就像預期的那樣,我可以test.sh
在任何地方執行。我遇到的問題是我希望將所有文件保存在我的硬碟驅動器上(在前面給出的目錄中)。但是,您無法在驅動器之間進行連結,因此正如預期的那樣,我遇到了錯誤
跨設備連結無效
所以我嘗試做一個像這樣的符號連結:
sudo ln -s ./test.sh /usr/local/bin/
它創建了一個預期的連結。但是,我不能test.sh
像我想要的那樣從任何目錄(甚至根本沒有)執行。為了確保文件在連結中不會失去權限,/usr/local/bin
我做sudo chmod +x ./test.sh
了並得到了一個錯誤:chmod:無法訪問’./test.sh’:符號連結的級別太多
我無法想像沒有辦法做到這一點,因為這似乎是一種常見的用法,但我不知道怎麼做。
摘要:如何在不同的物理驅動器上創建從一個文件到另一個文件的連結,並且仍然保留執行連結文件的能力。
- 訪問大量腳本的正確方法是將腳本所在的目錄添加到您的
$PATH
. 例如,我有我的個人腳本~/bin
,所以在我的.profile
,我有一行export PATH=$HOME/bin:$PATH
這將我
~/bin
放在現有路徑的前面,因此我可以通過具有相同名稱的腳本來“覆蓋”其他程序。如果您不希望這樣,請將新目錄放在$PATH
.因此,只需將保存腳本的目錄添加到路徑中,您的問題就解決了 - 完全沒有符號連結。
- 背景:在特定的文件系統上,文件使用它們的inode number來辨識。目錄只是將文件名映射到 inode 編號。如果不使用
ln
(-s
硬連結),則使用現有文件的 inode 創建一個新目錄條目。因此,很明顯,這僅適用於同一文件系統上的文件。OTOH,如果您使用
ln -s
,您正在創建一個符號連結(符號連結):一個特殊文件,其內容為您指定的路徑,當您嘗試訪問它時使用此路徑而不是文件。您無需成為 root 即可創建符號連結。3)當你這樣做
ln ~/test.sh /usr/local/bin
時,ln
命令會檢測到這/usr/local/bin
是一個目錄,所以它假設你真的想要執行ln ~/test.sh /usr/local/bin/test.sh
。同樣的情況也發生在-s
. 記住這一點很重要,因為您還可以對目錄進行符號連結。但是只有 root 可以創建到目錄的硬連結,因為您可以通過這種方式創建一個循環目錄結構(並且 root 應該知道足夠的知識,不要這樣做)。4)雖然硬連結確實有文件模式位,但符號連結沒有:對
chmod
符號連結的任何嘗試都只會更改它指向的文件上的文件模式位。5)我不知道當你無法執行時發生了什麼
test.sh
,Too many levels of symbolic links
錯誤消息表明你在某處有其他符號連結,所以有些事情搞砸了。我需要查看您的目錄結構以了解發生了什麼。6)如果您真的想將腳本目錄中的每個腳本符號連結到
/usr/local/bin/
而不是僅設置PATH
(我不建議這樣做),請考慮使用stow
:此程序一次設置許多符號連結。man stow
詳情。