35

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

4

7 回答 7

30

别名是Macintosh Finder 的概念。当您在 Finder 中创建别名时,Finder 会跟踪它。当您移动原始文件或文件夹时,别名会跟随它。

符号链接是Unix 文件系统的概念。当您创建符号链接时,它仅指向原始位置。移动原件,符号链接将无处可去。

当您使用 Mac 应用程序并使用“打开/保存”对话框时,它将处理别名,因为它使用 Finder API,而 Finder 处理别名跟踪。

Unix 工具不与 Finder API 集成,因此无法跟踪别名。但是,它们与处理符号链接的底层 Unix API 一起工作。您可以ls在符号链接上使用,因为它使用 Unix API。与 Python 相同。

回到系统 7/8/9 天,文件系统无法处理符号链接,就像 Windows API 使用快捷方式而不是符号链接一样。你需要别名。

但是,Mac OS X 是基于 Unix 的操作系统,因此理解符号链接的概念。Finder 现在将符号链接视为别名(除了符号链接在原始移动时不会更新)。别名的唯一原因是与旧的 Finder 文件系统兼容。

于 2013-08-26T21:28:12.070 回答
29

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

这个:

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

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

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

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

这两件事都是特定于 shell 的。它们使 shell 扩展sub1为指定的命令。

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

于 2013-08-26T20:52:44.213 回答
6

这真的是一个超级问题

本次辩论中有 3 个级别的别名

  1. 文件系统: ln -s "target-file-or-directory" "alias" - 这对于使用文件系统的所有程序(bash、Finder、应用程序)都是可视的
  2. Shell 别名:(bash/sh/zsh 等)-(部分问题)-仅由 shell 命令行使用
  3. MacOS Finder: “制作别名” - Finder 已知,大多数应用程序中的文件对话框

一些不同的用例:

  • 希望 shell 脚本 (bash) 以符号方式导航您的文件系统 - 然后使用ln -s ...当您安装java时,它会自行使用这种技术。在示例中尝试说出哪个 java并查看 java 在哪里。然后使用ls -a /usr/bin/java查看真正的位置。
  • 想要在 Finder 中进行快速链接,以便您可以导航到碰巧位于不同目录中的常见事物-> 使用Finder 制作别名
  • 想要使用 bash 的快捷方式启动 Sublime 编辑器,然后使用Shell alias。我有别名ll=ls -l - 每行列出一个目录。没有它我几乎不能使用bash :-) 请注意,这些替换只发生在bash中的命令行替换上,因此在 shell 脚本中用处不大。

我个人经常使用ln -s .. relative。

我也经常使用Finder 制作别名。这很容易,并且链接会随着项目的增多而跟随项目。但它不适用于bash - 因此,当我需要开始编写脚本时,有时我会将这些链接更改为 **ln -s ...*。

于 2018-02-03T09:15:10.107 回答
1

我认为您可能在上面的别名命令中遗漏了某些内容-它应该具有格式alias mumble="substitution",并且会导致您键入的任何以 mumble 开头的命令被替换替换。因此,如果您在配置文件中输入的内容是,alias subl="/Applications/path//to/subl"那么每当您在命令开头键入 subl 时,它就会被完整路径替换。

ln通过在文件系统中创建从一件事到另一件事的引用来工作。

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

于 2013-08-26T20:57:29.610 回答
1

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

于 2013-08-26T20:56:11.463 回答
1

ln -s创建一个符号链接,它几乎是您文件系统上的一个文件

别名是特定于 shell 的东西

因此,基本上,符号链接是一个更好的解决方案,因为它适用于所有事情。就像,如果你想让你的文件管理器用那个特定的程序打开文本文件,你可以把它指向你的符号链接,它就会工作。

于 2013-08-26T20:47:46.137 回答
1

编辑:另一条评论让我意识到我正在谈论的别名是特定于 mac 的“finder”别名,而这里有问题的别名是 bash“shell”别名。我的错。

符号链接或软链接指向路径:文件系统上的位置。如果位于该路径的文件或文件夹被移动或重命名,软链接现在将指向任何有用的东西。

别名可以包含对路径或文件 ID 或两者的引用,具体取决于实现。至少在 Mac OS X 上,默认值为两者,但路径优先于文件 ID。也就是说,只要您的别名引用的路径中存在某些内容,您的别名就会指向该路径,就像符号链接一样。但是,如果您的别名引用的路径中不存在任何内容,则它将指向原始文件 ID。

例如:

假设您创建了一个文件,然后通过指定文件路径为其创建别名。别名现在包含文件的文件 ID 以及文件的路径。默认情况下,别名将按照文件的路径将您带到该文件。

如果您现在将文件移动到其他位置,则别名将通过引用文件的文件 ID 跟随它。但是,如果您将新文件分配给与旧文件相同的文件路径,则别名现在将指向新文件,因为它更喜欢路径而不是文件 ID。

参考:http ://forums.macworld.com/index.php?/topic/142842-aliases-vs-symbolic-links/

于 2013-08-26T21:07:58.127 回答