Update-Zusammenfassung
Die betreffenden ausführbaren Dateien sind nicht das linux native Format (ELF), sie werden für Windows kompiliert. Während der Pfaderweiterung prüft bash die magische Zahl der Binärdatei. Wenn sie nicht mit ELF übereinstimmt, wird sie nicht über die Pfaderweiterung verfügbar gemacht. Bash für Windows enthielt jedoch die Möglichkeit, native Windows-Anwendungen aus der Bash-Umgebung zu starten. Aus diesem Grund funktioniert die direkte Ausführung (ohne Pfaderweiterung und anschließende binäre Prüfung) einwandfrei.
Die Auflösung ist entweder ein Alias-basierter .bashrc-Zusatz (oder eine Anzahl alternativer Methoden zur Nachahmung der Pfaderweiterung, wodurch die Auswertung der bash-Datei umgangen wird) oder die Installation der Linux-Version.
Ursprüngliche Antwort
Dateiberechtigungen
Möglicherweise handelt es sich um ein Problem mit Dateisystemberechtigungen. Wenn du cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin
und mvn so laufen willst, ./mvn
was passiert dann?
Was ist die Ausgabe ls -alt
in diesem Verzeichnis?
Wenn die Datei nicht ordnungsgemäß als ausführbar gekennzeichnet ist, wird sie nicht als "Programm" in Ihrem Pfad angezeigt. Wenn es sich um eine binäre Datei 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 die ls-Ergebnisse veröffentlichen), versuchen Sie, Ausführungsberechtigungen hinzuzufügen chmod ug+x mvn
Falsche Version installiert
Sind Sie sicher, dass Sie die Linux-native Version installiert haben - die gleiche Version, die Sie mit cygwin verwendet haben, wird auf jeden Fall nicht funktionieren.
Sie können die binäre Kompatibilität mit sudo apt-get install elf-binutils
der Datei mvn überprüfen. readelf -a mvn
Verwenden Sie dazu den Befehl. Wenn Sie eine Fehlermeldung wie "Keine ELF-Datei ..." erhalten, haben Sie Ihre Antwort.
Ich habe gerade bemerkt, dass Sie dem Test-Shell-Skript in Ihrem Beispiel keine Ausführungsberechtigungen hinzugefügt haben, das (wenn Sie nicht vergessen haben, den Schritt aufzulisten) den jeweiligen Fehler vollständig erklärt.
Zusammenfassung:
- Stellen Sie sicher, dass die ausführbaren Dateien im Maven-Bin-Verzeichnis mithilfe von chmod als ausführbar 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 dazu das Utilty-Readelf.
- Führen Sie den Shell-Skript-Test erneut aus, markieren Sie jedoch die ausführbare Datei.
Aktualisieren
Die Pfadfrage war ein roter Hering; Sie versuchen lediglich, ein binäres Format auszuführen, das nicht mit der Linux-Umgebung unter Windows kompatibel ist.
Oberflächlich gesehen bieten die beiden Umgebungen (cygwin und bash unter Windows) ein ähnliches Benutzererlebnis, die Implementierung und die daraus resultierende binäre Kompatibilität sind jedoch sehr unterschiedlich.
Fazit: Die Binärformate von Cygwin und Linux sind nicht kompatibel. Sie müssen die native Linux-Version installieren, um sie von bash unter Windows auszuführen. Sie können es auch von der Quelle innerhalb der Bash in der Windows-Umgebung kompilieren. Aber aufgrund der frühen Natur der Umgebung würde ich mir Sorgen machen, Abhängigkeiten zu jagen.
Kurze Beschreibung der beiden Umgebungen:
Cygwin ist eine Übersetzungsebene, die eine API für Systemaufrufe bereitstellt, die normalerweise nicht auf POSIX-Systemen verfügbar sind. Dadurch 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 - das binäre Programm wird jetzt nur noch in der Cygwin-Umgebung unter Windows ausgeführt. Diese Übersetzungsebene und die zugehörigen Bibliotheken ermöglichen die Kompilierung von Quellcode, der mit der Linux-API geschrieben wurde, in der cygwin-Umgebung und unter Windows. Auf diese Weise erstellte Binärdateien werden nicht nativ unter Linux oder Windows ausgeführt. nur im cygwin-umfeld.
Die von canonical bereitgestellte bash-Umgebung für Fenster unterscheidet sich wesentlich 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 die Binärdateien geändert werden müssen. In vielen Fällen kann eine gegen Ubuntu erstellte Binärdatei direkt in die Bash in der Windows-Umgebung kopiert und ohne Probleme ausgeführt werden.
Um als gültige ausführbare Datei in bash unter Windows erkannt zu werden, muss es in einem nativen binären Linux-Binärformat oder in einer Skriptdatei vorhanden sein, die mit dem Programm gekennzeichnet ist, um es zu interpretieren (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 ausführbaren Berechtigungsbits als auch das binäre Dateiformat geprüft werden (Kompatibilität mit einer magischen Zahl). Wenn es sich um eine binäre Datei handelt und kein ELF-Format vorliegt, wird sie nicht über die Pfaderweiterung der Shell ausgesetzt.
Um dieses Problem schwieriger zu klären, wurde die Möglichkeit hinzugefügt, native Windows-Anwendungen von bash unter Windows aus zu starten. Die binäre Dateiformatprüfung der bash-Pfaderweiterung wurde jedoch offensichtlich nicht berücksichtigt. Andernfalls war dies ein Fehler.
Zweite Bearbeitung:
Klarstellung zu Ihrer Frage:
Wenn Sie es direkt starten (./mvn), umgeht es die Bash-Auswertung und führt sie einfach aus. Die bash in Windows-Umgebung ist intelligent genug, um Windows-native ausführbare Dateien zu starten. Ich glaube nicht, dass ein cygwin-Binary ordnungsgemäß von bash gestartet werden könnte, aber ich könnte falsch sein - die Dokumentation ist zu diesem Zeitpunkt dürftig und ich habe momentan keine Testumgebung.
Problemumgehung, die gleichwertige Funktionen für die Unterstützung von Pfaden bietet:
Wenn Sie mit der Installation von maven ansonsten völlig zufrieden sind (keine anderen Kompatibilitätsprobleme, alles funktioniert einfach), aber es ist wichtig, dass Sie sich auf dem Pfad befinden, 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 diesem Verzeichnis, auf die Sie von überall innerhalb der Bash in der Windows-Umgebung zugreifen möchten.
Starten Sie bash oder quellen Sie die Datei neu und arbeiten Sie dann mvn
von einem beliebigen Verzeichnis aus (basierend auf Ihrer Anweisung, dass die direkte Ausführung im bin-Verzeichnis, ./mvn, funktioniert hat).