![Debian 替代系统:具有相同名称和优先级的程序](https://linux22.com/image/72903/Debian%20%E6%9B%BF%E4%BB%A3%E7%B3%BB%E7%BB%9F%EF%BC%9A%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E5%90%8D%E7%A7%B0%E5%92%8C%E4%BC%98%E5%85%88%E7%BA%A7%E7%9A%84%E7%A8%8B%E5%BA%8F.png)
我无法从update-alternatives
文档中理解优先级系统是如何工作的。
假设我想/usr/bin/node
指向nodejs
Nodejs 应用程序,并指向一个业余无线电节目,node
在其他情况下称为 。我不得不说:
update-alternatives --install /usr/bin/node nodejs /usr/bin/nodejs 100 --slave /usr/share/man/...
假设我有两个程序希望/usr/bin/node
是不同的东西,第一个 - Nodejs,第二个 - 业余无线电。他们如何确定使用哪一个?
优先级在这个过程中扮演什么角色?
添加:请注意npm
,nodejs 包管理器需要调用nodejs 命令node
,因此我必须将nodejs 安装为node
.
答案1
我认为您在这里误解了替代系统的作用。它用于提供一种使用类似类型的替代程序的简单方法。通常的示例,手册页中使用的是编辑器:
例如,如果系统上同时安装了文本编辑器 ed(1) 和 nvi(1),则替代系统将导致通用名称 /usr/bin/editor 默认引用 /usr/bin/nvi。
在您的情况下,node
指的是两个完全不同的应用程序。
如果两者都可以从主 Debian 存储库安装,那么很可能其中一个软件包维护者会命名其可执行文件,这样就不会与另一个软件包发生冲突。例如,无线电应用程序的二进制文件可以重命名为,/usr/bin/node_radio
这样它就不会与 Node.js 发生冲突/usr/bin/node
。
另一方面,如果您node
自己编译业余无线电,则必须确保更改编译,以便它不会创建相同名称的二进制文件,或者确保它安装到不同的路径中,例如/usr/local/bin/node
.如果您选择后者,那么node
当您在命令提示符下键入它时执行的命令取决于$PATH
变量中的搜索顺序。如果错误的执行一个后,您必须输入完整路径才能运行它:/usr/local/bin/node
。
无论如何,update-alternatives
这里对你没有帮助。
上述所有内容只是一个示例,作为快速检查,apt-get download node
随后dpkg --contents node_0.3.2-7.4_all.deb
显示业余无线电node
已安装为可执行文件的/usr/sbin/ax25-node
链接。 /usr/sbin/node
Node.js 安装/usr/bin/nodejs
因此两者永远不会发生冲突。
答案2
任何时候,/usr/bin/node
都只能是其中一个方案。替代机制是一种选择的方式。
当两者都安装时,优先级控制哪一个是默认值。他们没有提供一种方法来以某种方式同时拥有这两者,并根据其他程序所称的这个程序在两者之间进行选择。
当程序通过名称相互调用时,搜索路径上只能有一个具有给定名称的程序。您应该消除node
程序中命令的歧义。关注 Debian,用于nodejs
Node.js 和ax25-node
HAM 程序。如果有一个更改确实很烦人,请安装该node
软件包(/usr/bin/node
为 生成别名ax25-node
)或该nodejs-legacy
软件包(/usr/bin/node
为 生成别名nodejs
)。
如果您确实有很多调用node
且无法轻松更改的程序,请使用不同的PATH
变量运行它们,一个变量包含一个包含符号链接的目录ax25-node
,另一个包含一个包含符号链接的目录nodejs
:
mkdir -p /usr/local/etc/nodejs/bin /usr/local/etc/ax25/bin
ln -s ../../../../bin/nodejs /usr/local/etc/nodejs/bin/node
ln -s ../../../../bin/ax25-node /usr/local/etc/ax25/bin/node
PATH=/usr/local/etc/ax25/bin:$PATH program-using-ax25
PATH=/usr/local/etc/node/bin:$PATH program-using-nodejs