如何在目录中组织 ~/bin 下的脚本和工具,但将它们放在 $PATH 中?

如何在目录中组织 ~/bin 下的脚本和工具,但将它们放在 $PATH 中?

我总是在我的 中~/bin添加。正如 Ubuntu 中的默认设置一样。$PATH~/.profile

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

但是,在试用软件、编写脚本或测试没有 PPA、makefile 等的新软件时,我更喜欢将它们组织到目录中。例如(目前我的 ~/bin 中有大约 12 个这样的项目):

ber@audrey:~ ☙ ls bin/replicatorg-0033/
contributors.txt  examples  lib-i686    license.txt  readme.txt   scripts        todo.txt
docs              lib       lib-x86_64  machines     replicatorg  skein_engines  tools

这是一些 java 应用程序。replicatorg是可执行文件。

现在,我可以做四件事,但我正在寻找另一种更好的方法:

  1. 符号链接可执行文件~/bin. ln -s bin/replicatorg-0033/replicatorg bin/replicatorg。有时可行,但在本例中不行。该应用程序编写得不好,需要与其二进制文件相关的库:当符号链接或从其目录中复制时,它将无法运行。
  2. 还将每个子目录添加到 $PATH。但这意味着每次移动、下载或 git-clone 新目录时都要编辑 ~/.profile。
  3. 通过创建 makefile/install 脚本在系统范围内正确安装应用程序。大多数应用程序都是快速破解的,丑陋的,开发中的脚本和工具,在我看来这不是一个好主意。
  4. 将 ~/replicatorg-0033/ 的所有内容移到 ~/bin 中。对的。

那么:您如何组织您的~/bin

答案1

  1. 将每个子目录也添加到 $PATH。但这意味着每次我移动、下载或 git-clone 新目录时都要编辑 ~/.profile。

无需每次都进行编辑,请尝试以下操作:

if [ -f ~/bin ]; then
   for i in $( find ~/bin -type d ); do
     PATH=$PATH:$i
   done
fi

答案2

我创建了一个单独的目录来存放软件包(~/apps)。如果我想在 中包含某个程序$PATH,我会在 中创建一个符号链接,或者如果该程序不喜欢符号链接,我~/bin会在 中创建一个 shell 脚本包装器:~/bin

#!/bin/sh
exec ~/apps/package/bin/someprogram "$@"

$PATH对于包含许多程序的大型软件包,最好将目录添加到您的目录中,以避免~/bin目录中包含指向单个项目的多个符号链接。不过这取决于您的个人喜好。

相关内容