如果我有某个程序安装的命令行实用程序foo
,并且它没有添加到$PATH
,并且我想有一种简单的方法来使用它,那么似乎有三个选项:
创建符号链接,通常在
/usr/local/bin
或者可能是$HOME/bin
:ln -s /path/to/foo /usr/local/bin/foo
不要创建符号链接,而是创建可执行文件:
echo 'path/to/foo' > /usr/local/bin/foo chmod a+rx /usr/local/bin/foo
或编辑
.zshrc
并设置别名:alias foo='/path/to/foo'
我的问题:
- 这是正确的吗?
- 哪一个选项是“最佳”的(好吧,我确实意识到这是一种幼稚的问法……)或者至少更常被优先选择?
一个明显的解决方案是将包含该程序的目录添加到您的
PATH
设置中。这在 Windows 上很常见,但在 Unix 上却不常见。有几个原因说明这不是一个好主意:PATH
主要是为了程序到程序的调用。)PATH
,特别是在卸载程序后删除过时的条目。(Windows 通过让程序的安装程序处理设置来部分解决此问题PATH
。但许多程序没有附带可用的卸载程序。)/usr/local/bin
在(针对系统范围内安装的程序)或(针对安装在您帐户上的程序 — 您可以根据需要选择其他位置)中创建符号链接~/bin
(问题中的建议 1)是一个很好的解决方案。它使新安装的程序立即可供所有潜在调用者使用。安装只需创建一个符号链接。卸载只需删除一个符号链接。如果您忘记卸载符号链接,您可以轻松清理:只需删除所有悬空符号链接即可。这种方法的一个难点是记住创建链接很麻烦。幸运的是,有工具可以解决这个问题:Stow或其替代品之一,例如XStow。请参阅跟踪程序。
Stow 和 XStow 还负责提供相关资源,例如手册页。卸载程序后,它们可以删除悬空的符号链接。
有一些程序在通过符号链接调用时无法正常工作,因为它们希望在同一目录中找到其他文件(或附近的目录,例如,当您运行 时
/path/to/bin/foo
,它会查找/path/to/lib/foolib
)。大多数执行此操作的程序都会查看链接的目标,但有时您会遇到一个查看链接本身的程序。对于这样的程序,请使用下面的 shell 脚本包装器方法。shell 脚本包装器(问题中的建议 2)可以工作,但并不方便。您必须为每个程序编写该包装器。您必须记住在卸载时将其删除。它不处理相关资源(例如手册页)。因此,当符号链接方法不够好时,它更像是一种后备方法。
shell 脚本包装器方法的一个优点是,它可以让您控制调用可执行文件的确切路径,以防程序关心它。这还允许您设置环境变量,对于需要在其环境中进行特殊设置的程序,您不想随身携带这些设置。如果程序留下了垃圾(例如,不清理临时文件的程序),它还为您提供了在程序退出后进行清理的机会。
这是一个最小的 shell 脚本包装器,它可以确保一切顺利。特别是,它可以正确地传递所有命令行参数。它还会确保不会遗留 shell 包装器进程,如果您正在进行某种进程监控,这一点有时很重要。
shell 别名仅在您直接从交互式 shell 调用程序时才有效。它不适用于其他程序、已运行的 shell 实例、计划任务或通过诸如 或 等实用程序
find -exec
。xargs
我想不出使用此方法的充分理由。我从未有过 Mac,但我
alias
经常用 来做这件事。如果.zshrc
是 Mac 的等价物.bashrc
,则只需添加:然后运行:
touch ~/.zsh_aliases
现在只需使用任何文本编辑器将所有别名添加到该文件,它将在启动时自动加载。您可以
reboot
键入 或source ~/.zshrc
(或.
,如上所示,与源相同)来执行此操作而无需重新启动。来自我的文件中的一些
.zsh_aliases
示例:我不确定是否有
zsh
等价于bash -c
,但这不是必需的。将它与完整路径一起使用,例如conctvid
,您可以从任何目录运行该脚本、可执行文件或任何内容,并附带参数和所有内容。别名mdedit
在 Firefox 中打开我的基于浏览器的 Markdown 编辑器。你可以做很多事情。我甚至有别名
aka
,可以用它编辑我的别名文件nano
,并source
在退出时运行: