Dank des Jubiläums-Updates habe ich jetzt BASH unter Ubuntu unter Windows 10. Zuvor habe ich Cygwin verwendet und Maven in Cygwin eingerichtet (und es voll funktionsfähig gemacht), was hauptsächlich darin bestand, Maven zu installieren und dann meine PATH
Umgebung zu ändern Variable (in ~/.bashrc
)
Nun, ich versuche das Gleiche mit BUW zu tun, aber soweit ich das beurteilen kann, wird die PATH
Variable ignoriert (das Verzeichnis Maven bin zum Verzeichnis hinzufügen PATH
und dann die which mvn
Rückgabe leer ausführen ). Gibt es einen Trick, den ich vermisse, oder muss ich meinen PATH
in BUW anders einrichten ?
BEARBEITEN:
Lassen Sie mich genau sein. Was muss ich im "???" Schritt, um pathTestScript.sh auf den Pfad zu bekommen?
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!'
EDIT 2:
Ich möchte mit meinem eigentlichen Endziel ganz klar sein. Ich habe ein JDK und Apache Maven an den üblichen Stellen auf meinem System installiert. Ich hatte beide in Cygwin einwandfrei funktioniert. Jetzt, da BUW nicht mehr verfügbar ist, möchte ich sie stattdessen dort verwenden, aber ich kann nicht herausfinden, wie ich meine Umgebung für sie einrichten soll, da Änderungen, die ich an meinem PATH vornehme, keine Auswirkungen zu haben scheinen.
EDIT 3:
Ok, jetzt mache ich mir Sorgen, dass ich auf einer wilden Gänsejagd bin. Wenn ich das tue echo $PATH
, bekomme ich/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Das erwarte ich. Das habe ich in meine ~/.bashrc
Akte aufgenommen ... Dann mache ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin
ich und ich bekomme
m2.conf mvn mvn.cmd mvnDebug mvnDebug.cmd mvnyjp
Aber wenn ich das tue which mvn
, werde ich leer und wenn ich aufrufe mvn
, werde ich umgeleitet, um es apt-get
zu installieren.
Das Problem ist also nicht, dass der PFAD nicht aktualisiert wird, sondern nur ignoriert wird. Gibt es eine Möglichkeit, den PATH zu beachten? Wenn nicht, ist dies eine ziemlich schwache Version von Linux (IMO)
EDIT 4:
Es wurde ein paar Mal aufgerufen, und ja, mein zusammengeschlagenes Beispiel hat vergessen, die Datei als ausführbar zu markieren. In meinem realen Szenario (mit Maven) sind alle Dateien ausführbar:
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
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
Datei möglicherweise erst einmal, um einen Pfad hinzuzufügen?Antworten:
Zusammenfassung aktualisieren
Die fraglichen ausführbaren Dateien haben kein Linux Native Format (ELF), sondern sind für Windows kompiliert. Während der Pfaderweiterung überprüft bash die magische Zahl der Binärdatei. Wenn sie nicht mit ELF übereinstimmt, wird sie nicht über die Pfaderweiterung verfügbar gemacht. Bash for Windows enthielt jedoch die Möglichkeit, native Windows-Anwendungen aus der Bash-Umgebung heraus zu starten, weshalb die direkte Ausführung (ohne Pfaderweiterung und anschließende Binärprüfung) problemlos funktioniert.
Die Auflösung ist entweder eine aliasbasierte .bashrc-Ergänzung (oder eine beliebige Anzahl alternativer Methoden zur Nachahmung der Pfaderweiterung, um die Auswertung der Bash-Datei zu umgehen) oder die Installation der Linux-Version.
Ursprüngliche Antwort
Dateiberechtigungen
Möglicherweise handelt es sich um ein Problem mit den Dateisystemberechtigungen. Wenn Sie
cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin
und versuchen, mvn so auszuführen,./mvn
was passiert dann?Was ist die Ausgabe
ls -alt
in diesem Verzeichnis?Wenn die Datei nicht ordnungsgemäß als ausführbar markiert ist, wird sie nicht als "Programm" auf Ihrem Pfad angezeigt. Wenn es sich um eine Binärdatei handelt und nicht im 'Linux'-Format (ELF) vorliegt, wird sie auch nicht als ausführbare Pfaddatei angezeigt.
Wenn die direkte Ausführung von mvn nicht funktioniert (bitte veröffentlichen Sie die Ergebnisse von ls), fügen Sie Ausführungsberechtigungen hinzu
chmod ug+x mvn
Falsche Version installiert
Sind Sie sicher, dass Sie die native Linux-Version installiert haben? Die gleiche Version, die Sie mit Cygwin verwendet haben, wird mit ziemlicher Sicherheit nicht funktionieren.
Sie können die Binärkompatibilität mit
sudo apt-get install elf-binutils
der Datei mvn überprüfen,readelf -a mvn
indem Sie den Befehl verwenden. Wenn Sie eine Fehlermeldung wie "Keine ELF-Datei ..." erhalten, haben Sie Ihre Antwort.Ich habe gerade festgestellt, dass Sie dem Test-Shell-Skript in Ihrem Beispiel keine Ausführungsberechtigungen hinzugefügt haben, was diesen bestimmten Fehler vollständig erklärt (es sei denn, Sie haben einfach vergessen, den Schritt aufzulisten).
Zusammenfassung:
Aktualisieren
Das Pfadproblem war ein roter Hering; Sie versuchen nur, ein Binärformat auszuführen, das nicht mit Linux unter Windows kompatibel ist.
An der Oberfläche bieten die beiden Umgebungen (Cygwin und Bash unter Windows) eine etwas ähnliche Benutzererfahrung, aber die Implementierung und die daraus resultierende Binärkompatibilität sind sehr unterschiedlich.
Fazit: Cygwin- und Linux-Binärformate sind nicht kompatibel. Sie müssen die native Linux-Version installieren, um sie unter Windows unter Bash ausführen zu können. Sie können es auch aus dem Quellcode innerhalb der Bash-on-Windows-Umgebung kompilieren. Aufgrund der „frühen Tage“ der Umgebung würde ich mir jedoch Sorgen machen, Abhängigkeiten zu verfolgen.
Kurze Beschreibung der beiden Umgebungen:
Cygwin ist effektiv eine Übersetzungsschicht, die eine API für Systemaufrufe bereitstellt, die normalerweise auf Nicht-POSIX-Systemen nicht verfügbar sind. Auf diese Weise können Sie viele Programme kompilieren, die für die Ausführung unter Linux in der Windows-Umgebung geschrieben wurden. Es wird jedoch immer noch in einer 'Windows'-Umgebung ausgeführt - diese Binärdatei funktioniert jetzt nur in der Cygwin-Umgebung unter Windows. Diese Übersetzungsschicht und die zugehörigen Bibliotheken ermöglichen es, gegen die Linux-API geschriebenen Quellcode in der Cygwin-Umgebung zu kompilieren und unter Windows auszuführen. Auf diese Weise erstellte Binärdateien können nicht nativ unter Linux oder Windows ausgeführt werden. nur in der Cygwin-Umgebung.
Die Bash-Umgebung für Fenster, die von Canonical bereitgestellt werden, unterscheidet sich stark von Cygwin. Es 'erstellt' tatsächlich eine Umgebung für ein Programm, das tatsächlich Linux zu sein scheint - dh die Standardbibliotheken sind zusammen mit POSIX-Systemaufrufen verfügbar -, ohne dass Änderungen an den Binärdateien erforderlich sind. In vielen Fällen kann eine gegen Ubuntu erstellte Binärdatei direkt in die Bash-Windows-Umgebung kopiert und ohne Probleme ausgeführt werden.
Um als gültige ausführbare Datei in Bash unter Windows erkannt zu werden, muss sie in einem nativen Linux-Binärformat oder einer Skriptdatei vorliegen, die mit dem Programm zur Interpretation markiert ist (für ein Bash-Skript #! / Bin / bash). Eine native Linux-Binärdatei wurde für Linux-Bibliotheken und Systemaufrufe erstellt. Bash bestätigt, dass etwas eine gültige ausführbare Datei ist, indem sowohl die Berechtigungsbits der ausführbaren Datei als auch das Binärdateiformat überprüft werden (eine Prüfung der 'magischen Zahl'). Wenn es sich um eine Binärdatei handelt und nicht im ELF-Format vorliegt, wird sie nicht über die Pfaderweiterung für die Shell verfügbar gemacht.
Um die Klärung dieses Problems zu erschweren, haben sie teilweise die Möglichkeit hinzugefügt, native Windows-Anwendungen von Bash unter Windows aus zu starten, haben jedoch die Überprüfung des binären Dateiformats zur Erweiterung des Bash-Pfads eindeutig nicht behandelt - oder sie haben es getan, und es ist ein Fehler.
Zweite Bearbeitung:
Klarstellung zu Ihrer Frage:
Wenn Sie es direkt starten (./mvn), umgeht es die Bash-Auswertung und führt es einfach aus. Die Bash-on-Windows-Umgebung ist intelligent genug, um native Windows-ausführbare Dateien zu starten. Ich glaube nicht, dass eine Cygwin-Binärdatei ordnungsgemäß von Bash gestartet werden würde, aber ich könnte falsch liegen - die Dokumentation ist derzeit dürftig und ich habe derzeit keine Testumgebung, auf die zugegriffen werden kann.
Problemumgehung, die der Pfadunterstützung entspricht:
Wenn Sie ansonsten mit der Maven-Installation völlig zufrieden sind (keine anderen Kompatibilitätsprobleme, alles funktioniert einfach), es aber wichtig ist, sie auf dem Pfad zu haben, können Sie eine einfache Problemumgehung verwenden, die gleichwertige Funktionen bietet.
Fügen Sie in Ihrer .bashrc-Datei den folgenden Alias hinzu:
Wiederholen Sie das Äquivalent für alle anderen ausführbaren Dateien in dem Verzeichnis, auf das Sie von einer beliebigen Stelle innerhalb der Bash-on-Windows-Umgebung aus zugreifen möchten.
Starten Sie bash oder source die Datei neu und arbeiten Sie dann
mvn
in einem beliebigen Verzeichnis (basierend auf Ihrer Aussage, dass die direkte Ausführung aus dem bin-Verzeichnis ./mvn funktioniert hat).quelle
Versuchen Sie
echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path
(einen beliebigen Namen, den Sie wollen)source ~/.bash_path
echo $PATH
um zu sehen, ob sich etwas ändertchmod +x ~/pathTest/pathTestScript.sh
Um es direkt auszuführen, müssen Sie der Datei das Ausführungsrecht hinzufügen.pathTestScript.sh
Wenn dies funktioniert, fügen
source ~/.bash_path
Sie einfach die Zeile in Ihnen hinzu~/.bashrc
.Können Sie von anrufen
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
?quelle
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
und habe dasbin
zum PFAD hinzugefügt , aber ich kann es immer noch nichtwhich mvn
erfolgreich machen, was für mich keinen Sinn ergibt.Da es auf Ubuntu basiert, ist die eigentliche PATH-Datei "
/etc/environment
" (zeigt keinen Dateityp an).$ nano /etc/environment
ist der einfachste Weg, um die Datei zu bearbeiten. Sie werden so etwas sehen:Sie können das Verzeichnis, das Sie vor den Endzitaten auswählen, nach dem letzten Verzeichnis mit einem zusätzlichen
:
(Doppelpunkt) hinzufügen, der vom vorherigen Verzeichnis getrennt werden soll.Zuletzt müssen Sie die Datei "
/etc/environment
" ausführen ; Dies kann erreicht werden, indem Sie Folgendes eingeben:Ich lief diese ein
$ sudo -s
und überprüfte mit$ env
. Ich bin mir ziemlich sicher, dass der Befehl env die sofortigen Änderungen anzeigen sollte, und ein Neustart sollte das Ganze abrunden, nachdem die ausgewählten Änderungen vorgenommen wurden.quelle
/etc/environment
Datei ~ / pathTest hinzugefügt habe , wurde meine Datei nicht zum Pfad hinzugefügt. Ihre Lösung funktioniert nicht.