【问题标题】:What's the difference between ln -s and alias?ln -s 和别名有什么区别?
【发布时间】:2013-08-29 10:37:27
【问题描述】:

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

【问题讨论】:

  • 请注意,为了避免一些读者我刚刚经历的困惑。在这个问题和大多数(但not all)答案中,“别名”一词指的是在 Unix、Linux 等的许多 shell 中发现的alias 命令。例如,参见 LINFO 的The alias Command .这与 OS X 和 MacOS 上下文中“别名”的含义截然不同。例如,参见维基百科上的Alias (Mac OS)

标签: macos bash shell command-line


【解决方案1】:

别名是一个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 文件系统兼容。

【讨论】:

  • Finder 别名类似于符号链接,但 OP 创建的别名是 shell 别名,而不是 Finder 别名。这只是输入文件全名的文本替换类型快捷方式。它不会显示在 Finder 窗口中,但只有在终端窗口中输入时才会起作用。
  • 感谢您的详尽解释,但@beroe 是对的。我创建的别名仅适用于 shell,不会显示在 Finder 中。
  • 对不起,我看到了 Mac OS,我还以为你问的是 Finder Alias 和 Unix OS 符号链接之间的区别。在 Unix 中,别名是 shell 概念,而不是 OS 概念。并非所有 Unix shell 都支持别名(如原始的 Bourne shell)。在支持别名的 shell 中,只有当它像命令一样使用时才会检测到别名,而是执行命令字符串,但没有 shell 替换。你不会看到别名被替换,因为你有set -xv on。
  • 这个答案回答的问题比被问的更有意义:)
  • 您说“别名的唯一原因是与旧的 Finder 文件系统兼容”。但是,Finder 在移动原件时跟踪别名的能力难道不是使用它们的充分理由吗?
【解决方案2】:

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

这个:

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

创建一个别名,因此在 shell 命令中输入 subl 等同于输入 /Applications/path/to/subl

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

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

这两个东西都是特定于 shell 的;它们会导致 shell 将 sub1 扩展为指定的命令。

另一方面,

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

【讨论】:

  • Keith,您能否提供一个参考,说明为什么函数比别名更受欢迎(尤其是在这种情况下)?例如,此答案另有说明:unix.stackexchange.com/a/30950Thanks!
  • @cjerdonek:不,我没有参考资料。别名没有什么问题,但功能更强大。任何你可以用别名做的事情,你都可以用一个函数来做。
【解决方案3】:

这真是一个超级问题

本次辩论共有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 时,它将使用此技术它自己。在示例中尝试说出 which java 并查看 java 在哪里。然后使用 ls -a /usr/bin/java 看看是真的在哪里。
  • 想要在 Finder 中建立快速链接,以便导航到恰好位于不同目录中的常见事物 --> 使用 Finder 制作别名
  • 想要通过 bash 的快捷方式启动 Sublime 编辑器,然后使用 Shell 别名。我有别名 ll=ls -l - 每行列出一个目录。没有它我几乎不能使用 bash :-) 请注意,这些替换只发生在 bash 中的命令行替换上,因此在 shell 脚本中用处不大。

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

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

【讨论】:

    【解决方案4】:

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

    alias 是特定于 shell 的东西

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2010-12-14
            • 2021-02-26
            • 1970-01-01
            相关资源
            最近更新 更多