使应用程序在所有 shell 中可用

使应用程序在所有 shell 中可用

我开发了一个 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)。该目录默认位于$PATHbash 的变量中,因此所有脚本和应用程序都可以访问它。

脚本和应用程序不要使用你的.bashrc或你的$PATH变量。其中大多数将使用$PATH在中设置的变量/etc/profile。原因是脚本和应用程序在非交互式 shell 中运行。你也可以参考所以回答。

因此乍一看你有两个选择:

  1. 添加应用程序以/usr/local/bin/-更好的实践。
  2. 将其保留/opt/并将该路径添加到$PATH中的变量/etc/profile

相关内容