我最近开始使用fish,我需要使用一个jar文件,用于谷歌的bundletool。
因此,我需要为bundletool设置一个别名/函数,而且我选择了一个函数,因为它看起来更“可疑”。
我的功能很简单:
function bundletool
java -jar bundletool-all-1.12.1.jar $argv
endbundletool本身位于~/.local/bin,它位于我的鱼用户路径上:
lase@laser-razer /m/c/U/matth [1]> echo $fish_user_paths
/home/lase/.local/bin /usr/local/go/bin /home/lase/.nvm /home/lase/.cargo/bin /home/lase/.cargo在普通的shell中,我可以执行java -jar bundletool-all-1.12.1.jar,并且命令按预期运行。但是,在函数中,fish似乎不知道我的fish_user_paths,并报告它找不到jar文件。
为了纠正这种情况,我必须更新我的函数以指定完整的路径:
function bundletool
java -jar ~/.local/bin/bundletool-all-1.12.1.jar $argv
end这很管用,但我觉得我做的不对。我应该以一种不同的方式设置我的路径或功能吗?
发布于 2022-10-19 19:47:01
您的函数将在普通环境中运行。
它将与当前的$PATH一起运行,更重要的是运行当前的工作目录。
所发生的事情是:
java -jar bundletool-all-1.12.1.jar将告诉java运行在bundletool-all-1.12.1.jar中找到的jar。
值得注意的是,fish只是将字符串“bundletool 1.12.1.jar”交给java,而java则不会查看$PATH。它不关心$PATH。它只需查看“bundletool all-1.12.1.jar”,并尝试以该名称打开一个文件。
如果该文件位于当前目录中,它将找到该文件。
这也是当你以交互方式执行它的时候,它对你有用的原因--因为你碰巧在那个目录中。
然后用函数尝试它,但是从不同的目录尝试它,所以它不起作用。
这是可行的,但我觉得我做的不对。我应该以一种不同的方式设置我的路径或功能吗?
不,给出文件的完整路径而不是依赖于工作目录是正确的做法。
::$fish_user_paths只是您设置的一个变量,然后鱼类将注意添加到$PATH中。$PATH是fish和其他工具(包括任何命令fish启动(如果愿意)将使用的实际变量)来查找命令。
https://stackoverflow.com/questions/74128836
复制相似问题