簡體   English   中英

ln -s和別名有什么區別?

[英]What's the difference between ln -s and alias?

我剛剛找到了一個解決方法, 解決了我在安裝了MacPorts版本的python時使用Sublime Text 3的subl命令所遇到的問題 說明說要將軟鏈接ln-s放到/ bin中的命令行應用程序中。 alias subl="/Applications/path/to/subl" ,所以我打開了我的〜/ .profile並添加了一個別名: alias subl="/Applications/path/to/subl" 但這對我來說是一個新問題。 這兩者有什么區別:別名和軟鏈接?

它們是完全不同的東西,但在這種情況下它們可以用於類似的目的。

這個:

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個級別的別名

  1. 文件系統: ln -s“target-file-or-directory”“alias” - 這對於使用文件系統的所有程序都是可視的(bash,Finder,應用程序)
  2. Shell別名: (bash / sh / zsh等) - (部分問題) - 僅由shell命令行使用
  3. MacOS Finder: “make alias” - 由Finder知道,在大多數應用程序中都有文件對話框

一些不同的用例:

  • 希望shell腳本(bash)以符號方式導航文件系統 - 然后使用ln -s ...當你安裝java時 ,它將自己使用這種技術。 在示例中嘗試說出哪個java並查看java所在的位置。 然后使用ls -a / usr / bin / java來查看實際位置。
  • 想在Finder中做快速鏈接,這樣你就可以導航到恰好位於不同目錄中的常見事物 - >使用Finder make alias
  • 想要使用bash的捷徑啟動Sublime編輯器,然后使用Shell別名 我有別名ll = ls -l - 每行列出一個項目。 沒有它我幾乎不能使用bash :-)注意這些替換只發生在bash中的命令行替換上,因此在shell腳本中不太有用。

我個人經常使用ln -s ..

我也使用Finder制作別名 它很容易,鏈接跟隨項目,因為他們更多。 但它不能用bash工作 - 因此,當我需要開始編寫腳本時,我有時會將這些鏈接更改為** ln -s ... *。

ln -s創建一個符號鏈接 ,它幾乎是文件系統上的一個文件

別名是一個特定於shell的東西

所以,基本上,符號鏈接是一個更好的解決方案,因為它將適用於所有事情。 就像,如果你想讓你的文件管理器打開具有該特定程序的文本文件,你可以將它指向你的符號鏈接,它將會起作用。

別名只存在於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM