Cod*_*y S 8 bash environment-variables maven windows-10 windows-subsystem-for-linux
感谢周年更新,我现在在 Windows 10 上的 Ubuntu 上有 BASH。以前,我使用 Cygwin,并在 Cygwin 中设置了 Maven,(并使其完全工作),主要包括安装 Maven,然后修改我的PATH环境变量 (in ~/.bashrc)
好吧,我正在尝试使用 BUW 做同样的事情,但据我所知,该PATH变量被忽略(将 Maven bin 目录添加到PATH,然后执行which mvn返回空白)。是否有我遗漏的技巧,或者我是否必须PATH在 BUW 中进行不同的设置?
让我具体点。我需要在“???”中做什么 将 pathTestScript.sh 放到路径上的步骤?
mkdir -p ~/pathTest
touch ~/pathTest/pathTestScript.sh
echo '#!/bin/sh' >> ~/pathTest/pathTestScript.sh
echo 'echo "it works!"' >> ~/pathTest/pathTestScript.sh
bash ~/pathTest/pathTestScript.sh
# Should output 'it works!'
# ?????????
pathTestScript.sh
# Should output it works!'
Run Code Online (Sandbox Code Playgroud)
我想非常清楚我的实际最终目标。我的系统上通常安装了 JDK 和 Apache Maven。我让这两个在 Cygwin 中工作得很好。现在 BUW 出来了,我想在那里使用它们,但我不知道如何为它们设置我的环境,因为我对 PATH 所做的任何更改似乎都没有任何影响。
好的,现在我担心我正在疯狂追逐。如果我这样做echo $PATH,我得到/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
这就是我所期望的。这就是我放在我的~/.bashrc文件中的内容......然后我做了ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin然后我得到了
m2.conf mvn mvn.cmd mvnDebug mvnDebug.cmd mvnyjp
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时which mvn,我会mvn变成空白,如果我调用,我会被重定向以用于apt-get安装它。
所以问题不在于 PATH 没有被更新......它只是被忽略了。有没有办法让它注意PATH?如果没有,这是一个非常弱的 Linux (IMO) 版本
它已经被提出了几次,是的,我的拍打示例忘记将文件标记为可执行文件。在我的实际场景中(使用 Maven),这些文件都是可执行的:
cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin && ls -alt
total 36
dr-xr-xr-x 2 root root 0 Apr 19 11:56 ..
-r-xr-xr-x 1 root root 1843 Apr 19 11:56 mvnyjp
dr-xr-xr-x 2 root root 0 Apr 19 11:56 .
-r-xr-xr-x 1 root root 1815 Apr 19 11:56 mvnDebug
-r-xr-xr-x 1 root root 7383 Apr 19 11:56 mvn
-r-xr-xr-x 1 root root 1513 Apr 19 11:56 mvnDebug.cmd
-r-xr-xr-x 1 root root 6067 Apr 19 11:56 mvn.cmd
-r-xr-xr-x 1 root root 230 Apr 19 11:56 m2.conf
Run Code Online (Sandbox Code Playgroud)
有问题的可执行文件不是 linux 本机格式 (ELF),它们是为 Windows 编译的。在路径扩展期间,bash 检查二进制文件的幻数,如果它与 ELF 不匹配,则不会通过路径扩展公开它。但是,用于 Windows 的 bash 确实包含从 bash 环境启动本机 Windows 应用程序的功能,这就是直接执行(没有路径扩展和随后的二进制检查)工作正常的原因。
解决方案是基于别名的 .bashrc 添加(或模拟路径扩展从而绕过 bash 文件评估的任意数量的替代方法)或安装 linux 版本。
这可能是跨文件系统权限问题。如果您cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin尝试像这样运行 mvn./mvn会发生什么?
ls -alt该目录中的输出是什么?
如果文件没有正确标记为可执行文件,它就不会在您的路径上显示为“程序”。如果它是二进制文件而不是“linux”格式(ELF),那么它也不会显示为路径可执行文件。
如果直接执行 mvn 不起作用(请贴出 ls 结果),尝试添加执行权限 chmod ug+x mvn
您确定安装了 linux 本机版本吗?与 cygwin 一起使用的相同版本几乎肯定不起作用。
您可以检查二进制兼容性,
sudo apt-get install elf-binutils
然后在文件 mvn 上使用命令
readelf -a mvn
如果您收到诸如“不是 ELF 文件...”之类的错误,那么您就有了答案。
我只是注意到您没有在示例中向测试 shell 脚本添加执行权限,这(除非您只是忘记列出步骤)完全解释了该特定失败。
路径问题是一个红鲱鱼;您只是试图在 Windows 环境中执行与 linux 不兼容的二进制格式。
从表面上看,这两种环境(Windows 上的 cygwin 和 bash)提供了有些相似的用户体验,但实现和由此产生的二进制兼容性却大不相同。
底线 - Cygwin 和 Linux 二进制格式不兼容。您需要安装 linux 本机版本才能在 Windows 上从 bash 运行它。您也可以在 Windows 环境中的 bash 中从源代码编译它;但由于环境的“早期”性质,我会担心追逐依赖关系。
两种环境的简要说明:
Cygwin 实际上是一个翻译层,它为通常在非 POSIX 系统上不可用的系统调用提供 API,它允许您编译许多编写为在 windows 环境中在 linux 上运行的程序。然而,它仍然在“windows”环境中运行——该二进制文件现在只能在 windows 上的 cygwin 环境中运行。这个转换层和相关的库允许针对 Linux API 编写的源代码在 cygwin 环境中编译并在 Windows 上运行。以这种方式构建的二进制文件本身不会在 Linux 或 Windows 上运行;仅在 cygwin 环境中。
canonical 提供的 windows 上的 bash 环境与 cygwin 有很大不同。它实际上为一个看起来实际上是 linux 的程序“重新创建”了一个环境——即标准库与 POSIX 系统调用一起可用——而不需要对二进制文件进行任何修改。在许多情况下,针对 ubuntu 构建的二进制文件可以直接复制到 Windows 环境中的 bash 中,并且可以毫无问题地运行。
要在 windows 上的 bash 中被识别为有效的可执行文件,它需要采用本机 linux 二进制格式或用程序标记的脚本文件来解释它(对于 bash 脚本,#!/bin/bash)。将针对 linux 库和系统调用构建本机 linux 二进制文件。Bash 通过检查可执行权限位和检查二进制文件格式是否兼容(“幻数”检查)来确认某些内容是有效的可执行文件。如果它是一个二进制文件并且不是 ELF 格式,则它不会通过路径扩展暴露给 shell。
为了使这个问题更难澄清,他们增加了从 Windows 上的 bash 启动本机 Windows 应用程序的部分能力,但显然没有解决 bash 路径扩展二进制文件格式检查 - 或者他们做了,这是一个错误。
当您直接启动它 (./mvn) 时,它会绕过 Bash 评估并直接执行它。Windows 环境中的 bash 足够智能,可以启动 Windows 本机可执行文件,这是必须的。我不相信 cygwin 二进制文件会从 bash 正确启动,但我可能是不正确的 - 此时文档很少,我现在没有可访问的测试环境。
如果您对 maven 安装完全满意(没有其他兼容性问题,一切都只是“有效”),但将它放在路径上很重要,您可以使用一个简单的解决方法来提供等效的功能。
在 .bashrc 文件中,添加以下别名:
alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'
Run Code Online (Sandbox Code Playgroud)
对要从 Windows 环境中的 bash 中的任何位置访问的目录中的任何其他可执行文件重复等效的操作。
重新启动 bash 或源文件,然后mvn将在任何目录中工作(基于您的声明,即从 bin 目录中直接执行,./mvn,正在工作)。
| 归档时间: |
|
| 查看次数: |
12766 次 |
| 最近记录: |