添加到路径与从 /bin 链接

Ere*_*evi 30 path symlink directory-structure

我们的系统管理员在服务器上安装了一个软件应用程序 (Maven),并告诉每个人将该/usr/local/maven/bin/文件夹添加到他们的路径中。

我认为从/bin文件夹(或每个人在其路径中拥有的其他文件夹)链接该文件夹中的几个程序可能会更方便,如下所示:

ln -s /usr/local/maven/bin/* /bin
Run Code Online (Sandbox Code Playgroud)

这样对吗?我的建议是否有一些隐藏的副作用?

slm*_*slm 34

链接时

您通常不/usr/local/*与链接/bin,但这更多是一种历史惯例。一般来说,有一些“技术”原因导致您无法执行您的建议。

链接到可执行文件/bin可能会导致问题:

  1. 可能最大的警告是,如果您的系统正在由某种包管理器(例如 RPM、dpkg、APT、YUM、pacman、pkg_add 等)管理包。在这些情况下,您通常希望让包经理做的工作和管理目录,例如/sbin/bin/lib,和/usr。一个例外是/usr/local,这通常是一个安全的地方,可以按照您认为合适的方式进行操作,而不必担心包管理器会干扰您的文件。

  2. 通常,为其构建的可执行文件/usr/local会将这个 PATH 硬编码到它们的可执行文件中。/usr/local作为这些应用程序安装的一部分,还可能包含配置文件。因此,仅链接到可执行文件可能会导致这些应用程序在.cfg稍后查找文件时出现问题。下面是这种情况的一个例子:

    $ strings /usr/local/bin/wit | grep '/usr/local'
    /usr/local/share/wit
    /usr/local/share/wit/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 适用于查找.cfg文件的相同问题也可能发生在主应用程序需要运行的“帮助程序”可执行文件中。这些也需要链接到/usr/bin,知道这可能有问题,并且只有在您实际尝试执行链接的应用程序时才会显示。

注意:一般来说,最好避免链接到/usr/bin.

/etc/profile.d

与其让所有用户都提供这种管理,管理员可以$PATH通过在/etc/profile.d目录中添加相应的文件,轻松地将其添加到每个人的盒子中。

像这样的文件,/etc/profile.d/maven.sh

PATH=$PATH:/usr/local/maven/bin
Run Code Online (Sandbox Code Playgroud)

您通常以管理员身份执行此操作,而不是使用此操作污染所有用户的设置。

使用替代品

大多数发行版现在都提供了另​​一种称为alternatives(Fedora/CentOS) 或update-alternatives(Debian/Ubuntu) 的$PATH工具,您也可以使用它们循环进入可能在/bin. 使用此类工具是更可取的,因为这些工具更符合大多数管理员认为的“标准做法”,因此使系统更容易从一个管理员切换到另一个管理员。

这个工具在制作链接时做了类似的事情/bin;但它管理这些链接的创建和销毁,因此通过工具完成与直接按照您的建议完成时更容易理解系统的预期设置。

在这里,我使用该系统在一个盒子上管理 Oracle 的 Java:

$ ls -l /etc/alternatives/ | grep " java"
lrwxrwxrwx. 1 root root 73 Feb  5 13:15 java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java
lrwxrwxrwx. 1 root root 77 Feb  5 13:15 java.1.gz -> /usr/share/man/man1/java-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 70 Feb  5 13:19 javac -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javac
lrwxrwxrwx. 1 root root 78 Feb  5 13:19 javac.1.gz -> /usr/share/man/man1/javac-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 72 Feb  5 13:19 javadoc -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javadoc
lrwxrwxrwx. 1 root root 80 Feb  5 13:19 javadoc.1.gz -> /usr/share/man/man1/javadoc-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
Run Code Online (Sandbox Code Playgroud)

你可以看到这样的效果:

$ type java
java is /usr/bin/java

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java
Run Code Online (Sandbox Code Playgroud)

我的 0.02 美元

在 中建立链接/bin虽然合理,但大多数系统管理员可能会非常不鼓励:

  1. 会被拒绝,因为它被视为定制的,如果需要另一个管理员来拿起盒子可能会导致混乱
  2. 由于这种“脆弱”的定制,可能会导致系统在未来状态下崩溃。


jll*_*gre 7

回答提出的问题:

这样对吗?

,这是一种糟糕的做法。

我的建议是否有一些隐藏的副作用?

是的,有几个副作用。您的建议可能有效或无效,具体取决于应用程序,并且从长远来看可能会倒退或被破坏。

创建这样的符号链接有合理的理由:

  • 管理员不“拥有” /bin(见注 1),因为该目录属于操作系统/发行版开发人员。另一方面/usr/local是由本地管理员构建的软件的传统位置,/opt/<packagename>用于非捆绑软件。如果您创建一个文件或链接/bin,也为它被覆盖由包安装,在你的情况下,风险的假设maven由操作系统,如果在当地建立了一个由新创建可能导致一个回归提供包源代码表示操作系统版本。例如, SVR4 pkgadd、 debian dpkg、 red-hatrpm和 slackware tarball 都会令人眼花缭乱地覆盖您的符号链接。

  • 某些应用程序确实会查看调用它们的位置以检索配置文件、插件和类似资源。如果您通过符号链接调用应用程序,它的代码可能无法跟随它,然后/usr/bin在它们不在的地方寻找这些资源文件。

  • 可能还有其他二进制文件,如果/usr/local/maven/bin不将此目录添加到您的 PATH 中会使它们不可用。已删除,因为您已经通过链接所有潜在命令将其考虑到您的命令中。

  • maven2的页面告诉这个目录添加到您的PATH(准确地说:添加M2环境变量设置为路径,例如出口PATH = $ M2:$ PATH),通过使用不同的方法,你都打破了步骤,会不支持道路。当然,如果系统的大多数用户都是潜在maven用户,那么设置PATH全局而不是设置每个.profile.

注 1:

Slackware 文档:

   The /bin directory usually doesn't receive modification
   after installation. If it does, it's usually in the form
   of package upgrades that we provide.
Run Code Online (Sandbox Code Playgroud)

Debian / 文件系统层次标准

/bin/
   Essential command executable (binaries) for all users (e.g., cat, ls, cp) 
   (especially files required to boot or rescue the system)
...
/opt/
   Add-on application software packages 
   Pre-compiled, non ".deb" binary distribution (tar'ed..) goes here.
/opt/bin/
   Same as for top-level hierarchy
Run Code Online (Sandbox Code Playgroud)

Solaris 文档:

/usr/bin
   Platform-dependent, user-invoked executables. These  are
   commands  users expect to be run as part of their normal
   $PATH. For executables that are different  on  a  64-bit
   system  than  on a 32-bit system, a wrapper that selects
   the  appropriate  executable   is   placed   here.   See
   isaexec(3C).  An approved installation location for bun-
   dled Solaris software. The analogous location for add-on
   system     software     or     for    applications    is
   /opt/packagename/bin.
Run Code Online (Sandbox Code Playgroud)

显示 Debian 的简单测试dpkg不会保留现有链接,即使--force-overwrite未使用该选项:

# ls -l /usr/bin/banner
lrwxrwxrwx 1 root root 11 Feb 25 21:37 /usr/bin/banner -> /tmp/banner
# dpkg -i sysvbanner_1.0.15_amd64.deb 
Selecting previously unselected package sysvbanner.
(Reading database ... 236250 files and directories currently installed.)
Unpacking sysvbanner (from sysvbanner_1.0.15_amd64.deb) ...
Setting up sysvbanner (1.0.15) ...
Processing triggers for man-db ...
# ls -l /usr/bin/banner
-rwxr-xr-x 1 root root 11352 May  7  2009 /usr/bin/banner
Run Code Online (Sandbox Code Playgroud)