Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 什么';ln-s和alias的区别是什么?_Macos_Bash_Shell_Command Line - Fatal编程技术网

Macos 什么';ln-s和alias的区别是什么?

Macos 什么';ln-s和alias的区别是什么?,macos,bash,shell,command-line,Macos,Bash,Shell,Command Line,我刚刚找到了一个解决方法,在安装MacPorts版本的python时,我使用subl命令subl来实现Sublime Text 3。说明中说,在/bin中添加一个软链接,ln-s,指向命令行应用程序。这不起作用,所以我只打开了我的~/.profile并添加了一个别名: alias subl=“/Applications/path/to/subl”。 但这给我提出了一个新问题。这两者之间有什么区别:别名和软链接?ln-s创建了一个,它几乎是文件系统中的一个文件 是一个特定于外壳的东西 因此,基本上

我刚刚找到了一个解决方法,在安装MacPorts版本的python时,我使用subl命令
subl
来实现Sublime Text 3。说明中说,在/bin中添加一个软链接,
ln-s
,指向命令行应用程序。这不起作用,所以我只打开了我的~/.profile并添加了一个别名:
alias subl=“/Applications/path/to/subl”

但这给我提出了一个新问题。这两者之间有什么区别:别名和软链接?

ln-s
创建了一个,它几乎是文件系统中的一个文件

是一个特定于外壳的东西


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

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

这:

创建别名,以便作为shell命令键入
subl
相当于键入
/Applications/path/to/subl

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

subl() { /Applications/path/to/subl ; }
这两件事都是特定于外壳的;它们使shell将
sub1
扩展到指定的命令


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

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

我认为上面的alias命令中可能缺少一些东西——它应该具有
alias mumble=“substitution”
的格式,并且会导致以mumble开头的任何命令都被substitution替换。因此,如果您在配置文件中输入的是
alias subl=“/Applications/path//to/subl”
,则每当您在命令开头键入subl时,它都会被完整路径替换

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


您在上面提供的链接表明,
ln
与MacPorts中提供的Python版本不兼容。

编辑:另一条评论让我意识到我所说的别名是mac特定的“finder”别名,而这里讨论的别名是bash“shell”别名。我的错误

符号链接或软链接指向一个路径:文件系统上的一个位置。如果路径上的文件或文件夹被移动或重命名,则软链接现在将不会指向任何有用的内容

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

例如:

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

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


参考资料:

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

符号链接是Unix文件系统的概念。创建符号链接时,它仅指向原始位置。移动原始链接,符号链接将不会指向任何地方

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

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

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


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

这确实是一个超级问题

在这场辩论中,有三个级别的别名

  • 文件系统:ln-s“目标文件或目录”“别名”-这对于使用文件系统的所有程序(bash、Finder、应用程序)都是可视的
  • Shell别名:(bash/sh/zsh等)-(问题的一部分)-仅由Shell命令行使用
  • subl() { /Applications/path/to/subl ; }