Symlink

在不同的物理驅動器上執行符號連結

  • February 14, 2017

我的硬碟上有一個文件夾,裡面/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’:符號連結的級別太多

我無法想像沒有辦法做到這一點,因為這似乎是一種常見的用法,但我不知道怎麼做。

摘要:如何在不同的物理驅動器上創建從一個文件到另一個文件的連結,並且仍然保留執行連結文件的能力。

  1. 訪問大量腳本的正確方法是將腳本所在的目錄添加到您的$PATH. 例如,我有我的個人腳本~/bin,所以在我的.profile,我有一行
export PATH=$HOME/bin:$PATH

這將我~/bin 放在現有路徑的前面,因此我可以通過具有相同名稱的腳本來“覆蓋”其他程序。如果您不希望這樣,請將新目錄放在 $PATH.

因此,只需將保存腳本的目錄添加到路徑中,您的問題就解決了 - 完全沒有符號連結。

  1. 背景:在特定的文件系統上,文件使用它們的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.shToo many levels of symbolic links錯誤消息表明你在某處有其他符號連結,所以有些事情搞砸了。我需要查看您的目錄結構以了解發生了什麼。

6)如果您真的想將腳本目錄中的每個腳本符號連結到/usr/local/bin/而不是僅設置PATH(我不建議這樣做),請考慮使用stow:此程序一次設置許多符號連結。man stow詳情。

引用自:https://unix.stackexchange.com/questions/344810