Windows上的Ubuntu上的BASH(适用于Windows的AKA Linux子系统)10-如何设置PATH?


8

感谢Anniversary Update,现在我可以在Windows 10的Ubuntu上使用BASH了。以前,我使用Cygwin,并在Cygwin中设置了Maven(并使它完全工作),主要包括安装Maven,然后修改PATH环境。变量(在中~/.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!'

编辑2:

我想明确我的最终目标。我通常在系统上安装了JDK和Apache Maven。我在Cygwin上都运行得很好。既然BUW已经发布,我想在那里使用它们,但是我不知道如何为它们设置环境,因为我对PATH所做的任何更改似乎都没有效果。

编辑3:

好的,现在我担心我在追赶野鹅。如果这样做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

但是,当我这样做时which mvn,我会空白,如果调用mvn,我将被重定向到用于apt-get安装它。

因此,问题不在于PATH没有被更新……它只是被忽略了。有没有办法让它关注PATH?如果不是,这是一个相当弱的Linux(IMO)版本

编辑4:

它已经被启动了几次,是的,我拍的例子忘了将文件标记为可执行文件。在我的实际场景(使用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

1
也许C:\Users\%username%\AppData\Local\lxss\root\.bashrc现在编辑文件以添加路径?
彼得

@Peter那个目录不存在(我在本地下没有'lxss')
Cody S

1
在地址栏中键入它,您应该有它。否则,显示隐藏的系统文件夹。仅启用隐藏文件夹是不够的。参见superuser.com/questions/1108483/…–
彼得

啊,您是对的...但是现在我不确定那是我的问题。我将不得不编辑我的问题
Cody S

1
为什么在Bash中运行Windows Maven?Windows上的Bash在Linux内部运行,并且只能运行本机Linux二进制文件。您无法在其中执行Windows exe文件,与用于运行本机Windows二进制文件的Cygwin不同
phuclv

Answers:


6

更新摘要

有问题的可执行文件不是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脚本添加执行权限(除非您只是简单地忘记列出该步骤),否则就完全解释了该特定失败。

摘要:

  1. 确保使用chmod将maven bin目录中的可执行文件正确设置为可执行文件。在您的答案中发布ls -alt的输出。
  2. 确保您具有Linux二进制文件-使用实用程序readelf进行验证。
  3. 再次运行您的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环境中。

规范提供的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本机可执行文件。我不认为可以从bash正常启动cygwin二进制文件,但是我可能是不正确的-目前文档很少,而且我现在没有可访问的测试环境。

提供与“路径”支持同等功能的解决方法:

如果您对Maven安装完全满意(没有其他兼容性问题,一切都“正常”),但是在路径上安装它很重要,则可以使用简单的解决方法来提供同等的功能。

在您的.bashrc文件中,添加以下别名:

alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'

对要从Windows环境中的bash内的任何位置访问的该目录中的所有其他可执行文件重复相同的操作。

重新启动bash或获取文件,然后mvn可以在任何目录下工作(基于您从bin目录./mvn中直接执行的语句起作用)。


该文件是可执行文件,但不是ELF文件...但是到底是什么?Cygwin为什么可以运行此二进制文件,但BUW无法运行?而且,如果我导航到该目录,我仍然可以执行./mvn并执行,并且它在我的路径上,但是BUW拒绝确认它。为什么是/不是ELF文件与PATH行为有关?
科迪S

如我所说,Cygwin是Windows环境,只能运行Windows应用程序。Bash是Linux环境,只能运行Linux本机应用程序。它们是单独的环境。只需从本地Ubuntu安装中复制一些应用程序,然后尝试在bash中调用它,它便会毫无问题地运行。但是您不能在bash中运行Windows应用程序。如果您想以真正的bash运行,则需要再次为Linux安装Maven
phuclv

即使我从另一台Linux机器复制了maven,我也得到了“不是ELF文件”的结果。当我运行mvn时,我没有任何反应。Windows任务管理器中出现一个Java进程,我最终需要终止该进程才能在bash中获得“已杀死”响应。如果我尝试从“ / mnt / c / Program Files(x86)/ Maven / bin”运行maven,也会得到完全相同的行为。有任何想法吗?
papadi

0

试试 echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(您想要的任何名称)

source ~/.bash_path

echo $PATH 看看有什么变化

chmod +x ~/pathTest/pathTestScript.sh 为了直接运行它,您必须向文件添加执行权限。

pathTestScript.sh

如果一切正常,只是添加行source ~/.bash_path~/.bashrc

你可以援引/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn吗?


我可以通过调用/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn,并且已经将binPATH 添加到PATH中,但是我仍然无法which mvn成功完成,这对我来说没有任何意义。
科迪S

奇怪的。为了在寻找答案时变得更好,您可以尝试使用Linux别名使调用更加简单。linfo.org/alias.html
罗登·罗

0

由于它基于Ubuntu,因此实际的PATH文件为“ /etc/environment”(不显示文件类型)。

$ nano /etc/environment是编辑文件的最简单方法。您将看到如下内容:

PATH =“ / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / games:/ usr / local / games”

您可以在右引号之前,最后一个目录之后添加您选择的目录,并:在前面的目录之间加上一个额外的(冒号)。

最后,您必须运行文件“ /etc/environment”;这可以通过键入以下内容来完成:

$ . /etc/environment

我将它们放入$ sudo -s并检查了$ env。我对env命令应该显示立即的更改有一定的信心,并且在进行了选定的更改后,重新启动应该将其置顶。


我已经用场景编辑了问题,但是当我向/etc/environment文件中添加〜/ pathTest时,我的文件没有被添加到路径中。您的解决方案不起作用。
科迪S

不要使用〜; 使用完整路径。通过在正确的目录中键入pwd来获取它
djsmiley2kStaysInside

我没有 仍然不起作用。抱歉,我可以看到这可能会引起误解,但是不,我没有在环境路径中使用〜,我总是对其进行扩展
Cody S

我只是重新安装了该功能,但发现我的答案不够用,只能临时更改特定会话的路径。我正在寻找更多。对不起,科迪。
克里斯·伯纳德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.