我希望我的应用程序以bin
一种适用于所有 UNIX 的所有 shell(实际上是多个 shell)的方式将它自己的目录添加到路径中。这可能吗?
具体来说,目标是添加~/.myapp/bin/
用户路径的一部分。
简单地附加export PATH=~/.myapp/bin:$PATH
到是.bashrc
行不通的——zsh 用户等呢?此外,我不确定这在所有支持 shell 的平台上是否可靠。
我怀疑你问的是不可能的。没有一个所有炮弹都尊重的中心位置。许多 Bourne 风格的 shell(bash、zsh)可能会或可能不会~/.profile
根据其默认配置读取,但 csh 和 tcsh 读取的文件集完全不同,并且不要使用与 bash 相同的命令来设置变量,例如PATH
.
许多应用程序使用的另一种策略是将自己安装在/usr/local/ appname /或/opt/ appname /之类的位置,然后在/usr/local/bin/
. 例如,在我的 FreeBSD 系统上:
> cd /usr/local/bin ; ls -l drush mailq perl5
lrwxr-xr-x 1 root wheel 14 Apr 29 12:22 drush -> ../drush/drush
lrwxr-xr-x 1 root wheel 32 Apr 28 15:28 mailq -> ../../../usr/local/sbin/sendmail
lrwxr-xr-x 1 root wheel 25 Apr 17 01:17 perl5 -> /usr/local/bin/perl5.12.4
您可以做的任何事情来利用现有配置而不是需要定制的东西将减少失败的可能性。
此外,对于大多数平台,有一种“公认”的处理方式。如果您将软件安装到 FreeBSD 中,则应该通过FreeBSD“ports”系统来完成,该系统对文件的存放位置有自己的规则。MacPorts、Fink、Emerge 等也是如此。在你做一些在他们的各种用户社区中踩到脚趾的事情之前,请先阅读你的目标平台。
老实说,我会避免这样做。放入一个符号链接或一个 exec 脚本,~/bin
并通知用户$PATH
如果它还没有,他们必须添加它。
在我的系统上 bash 和 zsh source /etc/profile.env
,它是由目录env-update
内容生成的文件/etc/env.d
。但是像~/smth
这里添加路径可能不是一个好主意,这也是特定于发行版的(shell 使用它的唯一原因是代码
if [ -e /etc/profile.env ] ; then
. /etc/profile.env
fi
和/etc/profile
) /etc/zsh/zprofile
。
在 Bash 中,该变量$PATH
为您提供所有由 .分隔的bin
和文件夹。sbin
:
稍加替换,您就可以获得它们的列表。以雪豹为例:
$ echo ${PATH//:/ }
/opt/local/bin /opt/local/sbin /sw/bin /sw/sbin /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/local/git/bin /usr/X11/bin /usr/X11R6/bin