本地可执行文件应放在哪里?


62

我有一个针对perforce版本控制客户端(p4)的可执行文件。我无法放置它,/opt/local因为我没有root特权。是否需要将其放在下面的标准位置$HOME

文件系统层次结构是否有约定要求放置本地可执行文件/二进制文件$HOME/bin

我找不到Wikipedia文章中提到的有关FHS的约定。

另外,如果确实有约定,我是否必须明确包含$HOME/bin目录的路径或目录的位置bin

Answers:


64

通常,如果非系统安装和维护的二进制文件需要在系统范围内可供多个用户访问,则管理员应将其放置在中/usr/local/bin。有一个完整的层次结构/usr/local,通常用于本地编译和安装的软件包。

如果您是二进制文件的唯一用户,则安装到$HOME/bin适当的位置,因为您可以自己安装它,并且它将是唯一的使用者。如果从源代码编译软件包,则还可以在$HOME目录中创建部分或完整的本地层次结构。完整的本地层次结构如下所示。

  • $HOME/bin 本地二进制
  • $HOME/etc 本地二进制文件的特定于主机的系统配置
  • $HOME/games 本地游戏二进制文件
  • $HOME/include 本地C头文件
  • $HOME/lib 本地图书馆
  • $HOME/lib64 本地64位库
  • $HOME/man 本地在线手册
  • $HOME/sbin 本地系统二进制文件
  • $HOME/share 与本地体系结构无关的层次结构
  • $HOME/src 本地源代码

运行时configure,应通过指定$HOME默认安装的前缀来定义要安装的本地层次结构。

./configure --prefix=$HOME

现在make && make install运行时,已编译的二进制文件,程序包,手册页和库将安装到您的$HOME本地层次结构中。如果尚未手动创建$HOME本地层次结构,make install则将创建软件包所需的目录。

安装完成后$HOME/bin,您可以将其添加$HOME/bin到您$PATH的文件中,也可以使用absolute调用二进制文件$PATH。默认情况下,某些发行版将包含$HOME/bin在您$PATH的发行版中。您可以通过echo $PATH查看是否$HOME/bin存在来进行测试,或者将二进制文件放入$HOME/bin并执行which binaryname。如果返回$HOME/bin/binaryname,则默认情况下它位于$ PATH中。


5
只要$ HOME不在noexec挂载的文件系统上。/ tmp /通常也安装在noexec上。
ewanm89'4

3
这是正确的,它是文件系统层次结构标准(FHS)的一部分。pathname.com/fhs/pub/fhs-2.3.html#USRLOCALLOCALHIERARCHY
Patrick

29
我不建议使用$HOME。这会将您的主目录淹没在您根本不感兴趣的众多目录中。谁想要在主目录中拥有manlib等等。我宁愿在$HOME/bin或下创建层次结构$HOME/local。这样只会在您的主目录中添加一个子目录,而不是十个。在PATH可以容易地适用于包括$HOME/bin/bin$HOME/local/bin
马可(Marco)

18
一种选择是使用$ HOME / .local / {bin,lib等。},例如,使用基于XDG的规范(standard.freedesktop.org/basedir-spec/basedir-spec-latest.html)和python(python.org/dev/peps/pep-0370
janneb

4
@janneb 您引用的XDG基本目录规范仅提及$HOME/.local/share(版本0.7,2010年11月24日)。
Piotr Dobrogost,2015年

27

正如乌瑟尔提到的/usr/local旨在为,本质上是一个前缀,由系统管理员安装软件时/usr,应使用从分发的包安装的软件。

其背后的想法是避免与分布式软件(例如rpmdeb软件包)发生冲突,并让管理员完全控制“本地”前缀。

这意味着管理员可以安装定制的编译软件,同时仍然使用发行版(如debian)。

从FHS

放置在/或/ usr中的软件可能会因系统升级而被覆盖(尽管在这种情况下,我们建议发行版本不要覆盖/ etc中的数据)。因此,本地软件不得无正当理由放在/ usr / local外。

在安装特定于用户的软件时,建议使用$HOME前缀作为前缀,因为这可以确保您具有写权限。就个人而言,我觉得$HOME/.local过去是一个更优雅的解决方案,因为它避免了使您的(希望)漂亮而整洁的主目录杂乱无章!

$HOME/.local/share已经在使用freedesktop.org XDG基本目录规范,所以它并不需要太多想象添加$HOME/.local/bin到您$PATH和制作$HOME/.local/lib等,而你在它。

如果您真的不希望您的前缀成为隐藏目录,则可以轻松地创建一个指向其的符号链接,例如:

ln -s .local ~/local

边注

值得注意的是.config(not .local/etc)是$XDG_CONFIG_HOME用于特定于用户的配置文件的默认值。我还应该指出,不幸的是,很大一部分软件会忽略XDG并在需要的地方(通常在的根目录$HOME)创建配置文件。另外请注意,$XDG_CONFIG_HOME如果$HOME/.config需要默认值,则可以将其设置为未设置。

奇怪的是,没有为发行版的默认配置文件保留目录,因此无法知道其中的文件/etc是由发行版提供还是由系统管理员编辑的。


1
我找不到任何提及.local在FHS
丹尼尔塞罗迪奥

@DanielSerodio它在XDG目录规范中,这是一个越来越受关注的更新标准。见unix.stackexchange.com/questions/316765/...superuser.com/questions/1170793/...
ivan_pozdeev

/etc当与多位管理员一起管理服务器时,有关该注释的内容确实令人讨厌-很难跟踪对conf文件的自定义编辑。
11:33结束
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.