[英]What's the difference between ln -s and alias?
它們是完全不同的東西,但在這種情況下它們可以用於類似的目的。
這個:
alias subl="/Applications/path/to/subl"
創建別名,以便將subl
鍵入shell命令等同於鍵入/Applications/path/to/subl
。
在bash中,函數通常比別名更受歡迎,因為它們更靈活,更強大。
subl() { /Applications/path/to/subl ; }
這兩件事都是針對shell的; 它們使shell將sub1
擴展為指定的命令。
另一方面, ln -s
在文件系統中創建符號鏈接 。 符號鏈接是對另一個文件的引用,對於大多數用途,它可以被視為文件本身。 它適用於訪問它的任何東西,而不僅僅是shell,它對系統上運行的所有進程立即可見,並且一直持續到它被刪除。 (符號鏈接實現為包含目標文件名稱的小型特殊文件。)
Alias是Macintosh Finder的概念 。 在Finder中創建別名時,Finder會跟蹤它。 移動原始文件或文件夾時,別名會跟隨它。
符號鏈接是Unix文件系統概念 。 當您創建符號鏈接時,它僅指向原始位置。 移動原始,符號鏈接將無處可尋。
當您使用Mac應用程序並使用“打開/保存”對話框時,它將處理別名,因為它使用Finder API,Finder處理別名跟蹤。
Unix工具不與Finder API集成,因此無法跟蹤別名。 但是,它們使用處理符號鏈接的底層Unix API。 您可以在符號鏈接上使用ls
,因為它使用Unix API。 與Python相同。
回到System 7/8/9天,文件系統無法處理符號鏈接,就像Windows API使用快捷方式而不是符號鏈接一樣。 你需要別名。
但是,Mac OS X是基於Unix的操作系統,因此理解符號鏈接的概念。 Finder現在將符號鏈接視為別名(除了原始移動時符號鏈接不會更新)。 別名的唯一原因是與舊的Finder文件系統兼容。
這真是一個超級問題
在這場辯論中有3個級別的別名
一些不同的用例:
我個人經常使用ln -s ..
我也使用Finder制作別名 。 它很容易,鏈接跟隨項目,因為他們更多。 但它不能用bash工作 - 因此,當我需要開始編寫腳本時,我有時會將這些鏈接更改為** ln -s ... *。
別名只存在於shell的上下文中(Bash,Sh,Zsh等),但在其他應用程序中找不到,而ln -s
創建一個虛擬文件(一個鏈接)到現有的真實文件,它可以像一個新的命令,應該可以被大多數調用其他二進制文件的應用程序認知。 別名與函數和變量類似,只是它們更像命令模板。 創建一個函數實際上更值得稱道。
我認為您可能在上面的別名命令中遺漏了某些內容 - 它應該具有alias mumble="substitution"
並且會導致您從mumble開始鍵入的任何命令被替換替換。 因此,如果您在配置文件中輸入的是alias subl="/Applications/path//to/subl"
那么無論何時在命令開頭鍵入subl,它都會被完整路徑替換。
ln
通過創建文件系統從一件事到另一參考。
您在上面提供的鏈接表明ln
不適用於MacPorts中提供的Python版本。
編輯:另一個評論讓我意識到我所說的別名是一個特定於mac的'finder'別名,而這里討論的別名是bash'hell'別名。 我的錯。
符號或軟鏈接指向路徑:文件系統上的位置。 如果移動或重命名位於路徑中的文件或文件夾,則軟鏈接現在將無用。
別名可以包含對路徑或文件ID或兩者的引用,具體取決於實現。 至少在Mac OS X上,默認值是兩者,但路徑優先於文件ID。 也就是說,只要別名引用的路徑中存在某些內容,您的別名就會指向路徑, 就像符號鏈接一樣。 但是,如果別名引用的路徑中不存在任何內容,則它將指向原始文件ID。
例如:
假設您創建了一個文件,然后通過指定文件路徑為其創建別名。 別名現在包含文件的文件ID以及文件的路徑。 默認情況下,別名將按照文件的路徑將您帶到文件。
如果現在將文件移動到其他位置,則別名將通過引用文件的文件ID來跟隨它。 但是,如果將新文件分配給與舊文件相同的文件路徑,則別名將指向新文件,因為它優先於文件ID的路徑。
參考: http : //forums.macworld.com/index.php?/topic / 142842-aliases-vs-symbolic-links/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.