![选项 1:更合适放置的符号链接](https://linux22.com/image/1542216/%E9%80%89%E9%A1%B9%201%EF%BC%9A%E6%9B%B4%E5%90%88%E9%80%82%E6%94%BE%E7%BD%AE%E7%9A%84%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.png)
我使用的是 macOS,我的 shell 是 zsh。默认情况下,我的系统主目录是/Users/njohn
。我创建了一个指向此路径的符号链接/usr/local/home
。我将HOME="/usr/local/home"
我的放在了.zshrc
。我这样做是为了首先,我可以快速cd ..
从我的主目录,然后我将进入我/usr/local
的所有自制软件包和配置文件所在的位置。这是一个非常简单的快捷方式。我还喜欢能够使用cd
并到达我的符号链接路径,而不是正常的路径,正常的路径在文件系统中远离我想要更接近的东西。
这可能会破坏任何东西吗?有没有更安全或更好的方法可以完成同样的事情?
答案1
免责声明:我没有使用过 MacOS,因此我不完全确定 Mac 和 *nix 之间是否存在任何异常或细微差别。
回答你的问题,我能想象到的唯一“破坏”此设置的情况是当某个程序尝试对您的主目录执行某些操作并且默认情况下不遵循符号链接(或者由于某种原因根本不遵循符号链接)时。如果任何假设的程序尝试读取/写入主目录中的某个文件,并且它无法解析您的/usr/local/home
符号链接,则事情可能会中断。虽然这种情况发生的可能性超出了我的能力范围。
话虽如此,我认为最好采用不修改变量的方法$HOME
。$HOME
在您启动的每个交互式 shell 的生命周期内,将变量更改为系统所理解的主目录以外的其他内容是丑陋的、不规范的,并且必然会导致微妙的问题。我将为您提供三种更好的替代方案。
选项 1:更合适放置的符号链接
如果你想要使用符号链接,只需/usr/local
从你的主目录创建一个符号链接,删除你现在的链接,然后从中/usr/local/home
删除更改变量的行。例如:$HOME
.zshrc
% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local
与您当前拥有的类似,您可以从主目录快速访问 /usr/local,但这样您无需更改$HOME
。
选项 2:命名目录
由于你使用的是 Zsh,我建议使用命名目录。不要这样做HOME=/usr/local/home
,而是执行以下操作,uloc
用您选择的简称替换:
uloc=/usr/local
然后你可以快速切换到该目录从任何地方通过以下方式:
# With no special options set
% cd ~uloc
# Slightly shorter
% setopt cdable_vars
% cd uloc
# Even shorter
% setopt cdable_vars auto_cd
% uloc
如你所见,如果你有一个扩展为路径的变量,你可以cd
在 Zsh 中用一个字符作为前缀来使用它~
,类似于你可以用作 的~user
快捷方式/home/user
。你可以拥有任意数量的命名目录,这样你就可以快速访问任何您经常使用的目录,而不仅仅是/usr/local
您的情况。
该cdable_vars
选项允许您在使用时省略~
命名目录cd
,这auto_cd
意味着如果您输入的“命令”实际上是一个目录(命名或文字),Zsh 将自动cd
转到该目录。将这两个结合起来可以让您快速访问所需的目录不管你在哪。 与之相反选项1,因为你不依赖符号链接,cd
所以指向这个命名的目录会将你放入该目录中,这样pwd
就会返回/usr/local
而不是/Users/njohn/uloc
。
选项 3:使用 CDPATH
这种方法可以单独使用,也可以与选项 2。
您还可以使用$CDPATH
,这是一个特殊的变量,用于$PATH
保存目录列表。$PATH
但是,与 不同,如果在当前目录下找不到给定的路径,则 中的目录$CDPATH
将用作给定相对路径的“根” cd
。为了演示,请考虑以下内容:
# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]
share
由于中没有指定的目录~/foo
,Zsh 会查找可能存在子目录的$CDPATH
位置。由于位于 中,并且是 的子目录,因此您可以从 内部访问。您还可以更深入地访问;例如,如果是 的子目录,则可以通过执行 到达那里。share
/usr/local
$CDPATH
share
/usr/local
cd share
~/foo
stuff
/usr/local/share
cd share/stuff
笔记:与 Bash 不同,Zsh 总是在当前目录中查找前尝试目录$CDPATH
,除非a.
包含在 中$CDPATH
。在这种情况下,Zsh 严格遵守 中的目录顺序$CDPATH
。
这为您提供了更多的便利,因为正如您所说,您经常需要访问您的自制包和配置,您可以cd
从任何地方进入其中一个子目录,而不需要任何前缀!
正如前面提到的,你可以将其与命名目录结合使用。从我自己的点文件中提取一个示例:
ZSH=~/.zsh
cdpath=(~/.zsh)
# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]
进一步阅读
我建议你更熟悉 Zsh 及其众多功能*。以下是一些你可以查看的手册页和其他主题:
symlink(7)
— 详细描述符号链接以及它们如何交互。zshexpn(1)
,“静态命名目录”——解释命名目录,手册页的其余部分描述了 Zsh 中的所有扩展形式。zshparam(1)
, “SHELL 使用的参数” — 包括特殊变量的描述,cdpath
例如zshoptions(1)
— 详细说明通过内置命令控制 Zsh 行为的所有选项。包括比此答案提供的setopt
更深入的解释。cdable_vars
auto_cd