我开发了一个 Java 应用程序,想发布给我的用户。此应用程序是一个辅助应用程序,由许多不同的 shell 脚本使用,例如 sh、su、bash 和 zsh 等等。我目前的方法是将我的程序放在 /opt/myapp 中,并使用 sh 脚本来运行该应用程序。
#!/bin/bash
"$JAVA_HOME/bin/java" -jar /opt/myapp/myapp-1.0.jar $@
我要求我的用户将export PATH=$PATH:/opt/myapp
诸如 之类的内容添加到他们的源中~/.zsrch
。但是,我一直遇到一些脚本或程序找不到应用程序的问题bash: myapp: command not found
,但它在 /bin/su 和 /bin/zhc 中可以正常工作。
在 Linux 和 MacOS 上“安装”我的应用程序的正确方法是什么,以便它可以在所有 shell 中使用。
/opt/myapp 文件夹
bash-3.2$ ls -l
total 40624
-rwxr-xr-x 1 root wheel 66 Apr 2 05:06 myapp
-rw-r--r-- 1 root wheel 20794374 Apr 2 05:05 myapp-1.0.jar
小路
bash-3.2$ echo $PATH
/opt/myapp:/Library/TeX/texbin::/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:::/Users/accoun/bin
其中一个例子是 IntelliJ 插件运行应用程序以获取信息。该插件将/bin/bash -c myapp version
作为进程运行,但该进程的输出是bash: myapp: command not found
。但是,如果我打开控制台运行 bash,它就可以正常工作。
~ » /bin/bash accoun@MACC02YX270LVDQ
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
bash-3.2$ echo $PATH
/opt/myapp:/Library/TeX/texbin::/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin:/usr/local/share/dotnet:~/.dotnet/tools:::/Users/accoun/bin
bash-3.2$ myapp version
Myapp version 1.0
bash-3.2$
答案1
正如@DanielB在评论中提到的那样,问题和解决方案都非常简单。您将程序/脚本/应用程序添加到了错误的目录中。您应该将其添加到/usr/local/bin/
符合文件系统层次标准(并且 Linux 系统(在大多数发行版中)的所有默认设置都符合 FHS)。该目录默认位于$PATH
bash 的变量中,因此所有脚本和应用程序都可以访问它。
脚本和应用程序不要使用你的.bashrc
或你的$PATH
变量。其中大多数将使用$PATH
在中设置的变量/etc/profile
。原因是脚本和应用程序在非交互式 shell 中运行。你也可以参考这所以回答。
因此乍一看你有两个选择:
- 添加应用程序以
/usr/local/bin/
-更好的实践。 - 将其保留
/opt/
并将该路径添加到$PATH
中的变量/etc/profile
。