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:
- Stellen Sie mithilfe von chmod sicher, dass die ausführbaren Dateien im Verzeichnis maven bin ordnungsgemäß als ausführbare Dateien festgelegt sind. Veröffentlichen Sie die Ausgabe von ls -alt in Ihrer Antwort.
- Stellen Sie sicher, dass Sie eine Linux-Binärdatei haben - verwenden Sie das Dienstprogramm readelf, um dies zu überprüfen.
- Führen Sie Ihren Shell-Skript-Test erneut aus, markieren Sie diesmal jedoch die ausführbare Datei.
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:
alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'
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).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
Datei möglicherweise erst einmal, um einen Pfad hinzuzufügen?