ln -s和别名有什么区别?

时间:2013-08-26 20:37:26

标签: macos bash shell command-line

当我安装了MacPorts版本的python时,我刚刚找到了problem的解决方法,我正在使用Sublime Text 3的subl命令。说明指示将软链接ln-s放入/ bin中的命令行应用程序。这没用,所以我刚打开了我的〜/ .profile并添加了一个别名:     alias subl="/Applications/path/to/subl"。 但这对我来说是一个新问题。这两者有什么区别:别名和软链接?

7 个答案:

答案 0 :(得分:25)

它们是完全不同的东西,但在这种情况下它们可以用于类似目的。

此:

alias subl="/Applications/path/to/subl"

创建一个别名,因此键入subl作为shell命令等同于键入/Applications/path/to/subl

在bash中,函数通常比别名更受欢迎,因为它们更灵活,更强大。

subl() { /Applications/path/to/subl ; }

这些东西都是特定于shell的;它们使shell将sub1扩展为指定的命令。

另一方面,

ln -s在文件系统中创建符号链接。符号链接是对另一个文件的引用,对于大多数用途,它可以被视为文件本身。它适用于访问它的任何东西,而不仅仅是shell,它对系统上运行的所有进程立即可见,并且一直持续到它被删除。 (符号链接实现为包含目标文件名称的小特殊文件。)

答案 1 :(得分:22)

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文件系统兼容。

答案 2 :(得分:6)

It is really a super question

There are 3 levels of aliases in this debate

  1. File system: ln -s "target-file-or-directory" "alias" - this is visual for all programs using the file system (bash, Finder, applications)
  2. Shell alias: (bash/sh/zsh etc) - (part of question) - only used by shell command line
  3. MacOS Finder: "make alias" - Known by Finder, and file dialogue box in most applications

Some different use cases:

  • Want shell scripts (bash) to navigate your file system in a symbolic way - then use ln -s ... When you install java it will use this technique it self. In example try to say which java and see where java is. Then use ls -a /usr/bin/java to see where is really is.
  • Want to do fast links in Finder so you can navigate to common things that happens to be located in different directories --> use Finder make alias
  • Want to start Sublime editor with a short cut from bash then use Shell alias. I have alias ll=ls -l - that lists a directory one item per line. I hardly cannot use bash without it :-) Note these substitutions only takes place on the command line substitution in bash and is therefore less useful in shell scripts.

Personally I use ln -s .. relative often.

I also use Finder make alias a lot. It is easy and links follows the items as they more around. But it does not work from bash - therefore I sometimes changes these links to **ln -s ...* when I need to start scripting.

答案 3 :(得分:1)

ln -s创建一个symbolic link,它几​​乎是文件系统上的文件

alias是特定于shell的内容

所以,基本上,符号链接是一个更好的解决方案,因为它将适用于所有事情。比如,如果您想让文件管理器使用该特定程序打开文本文件,您可以将其指向您的符号链接,它将会起作用。

答案 4 :(得分:1)

别名仅存在于shell的上下文中(Bash,Sh,Zsh等),但在其他应用程序中找不到,而ln -s创建一个现有真实文件的虚拟文件(链接)这可能会像一个新的命令一样呈现,并且应该被大多数调用其他二进制文件的应用程序认知。别名与函数和变量类似,只是它们更像命令模板。实际上创建一个函数更值得称道。

答案 5 :(得分:1)

我认为您可能在上面的别名命令中遗漏了某些内容 - 它应该具有alias mumble="substitution"形式,并且会导致您从mumble开始键入的任何命令被替换替换。因此,如果您在个人资料中输入的内容为alias subl="/Applications/path//to/subl",则无论何时在命令开头键入subl,都会将其替换为完整路径。

ln的工作原理是在文件系统中创建一个引用到另一个引用。

您在上面提供的链接表明ln不适用于MacPorts中提供的Python版本。

答案 6 :(得分:1)

编辑:另一条评论让我意识到我所说的别名是一个特定于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/