BASH unter Ubuntu unter Windows (AKA Linux Subsystem für Windows) 10 - Wie stelle ich meinen PFAD ein?

11470
Cody S

Dank des Anniversary-Updates habe ich jetzt BASH unter Ubuntu unter Windows 10. Ich habe vorher Cygwin verwendet und Maven in Cygwin eingerichtet (und funktionierte voll), was hauptsächlich darin bestand, Maven zu installieren und meine PATHUmgebung zu modifizieren Variable (in ~/.bashrc)

Nun, ich versuche dasselbe mit BUW zu tun, aber soweit ich das beurteilen kann, wird die PATHVariable ignoriert (das Maven bin-Verzeichnis wird hinzugefügt PATH, und das Ausführen wird which mvnleer zurückgegeben). Gibt es einen Trick, den ich vermisse, oder muss ich ihn PATHin BUW anders einrichten ?

BEARBEITEN:

Lass mich konkret 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 tatsächlichen Endziel sehr klar sein. Ich habe an den üblichen Stellen ein JDK und Apache Maven auf meinem System installiert. Ich hatte beide in Cygwin perfekt funktioniert. Nun, da BUW draußen ist, möchte ich sie stattdessen verwenden, aber ich kann nicht herausfinden, wie ich meine Umgebung für sie einrichten kann, da alle Änderungen, die ich an meinem PFAD mache, keine Auswirkung zu haben scheinen.

EDIT 3:

Ok, jetzt bin ich besorgt, ich bin auf einer wilden Gänsejagd. 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 ist was ich in meine ~/.bashrcAkte stecke ... Dann mache ls /mnt/c/Program\ Files/apache-maven-3.3.9/binich und ich bekomme

m2.conf mvn mvn.cmd mvnDebug mvnDebug.cmd mvnyjp 

Aber wenn ich dies tue which mvn, werde ich leer, und wenn ich anrufe mvn, werde ich weitergeleitet, um es apt-getzu installieren.

Das Problem ist also nicht, dass der PATH nicht aktualisiert wird, sondern einfach ignoriert wird. Gibt es eine Möglichkeit, den PFAD aufmerksam zu machen? Wenn nicht, ist dies eine ziemlich schwache Version von Linux (IMO).

EDIT 4:

Es wurde ein paar Mal angesprochen, und ja, mein zusammengeschlagenes Beispiel hat vergessen, die Datei als ausführbar zu kennzeichnen. In meinem realen Szenario (mit Maven) sind die Dateien alle 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 
8
Bearbeiten Sie möglicherweise die Datei `C: \ Users \% username% \ AppData \ Local \ lxss \ root \ .bashrc`, um den Pfad hinzuzufügen. Peter vor 7 Jahren 1
@Peter Das Verzeichnis existiert nicht (ich habe kein 'lxss' unter Local) Cody S vor 7 Jahren 0
Geben Sie es in die Adressleiste ein. Sie sollten es haben. Andernfalls zeigen Sie ausgeblendete Systemordner an. Das Aktivieren versteckter Ordner reicht nicht aus. Siehe http://superuser.com/questions/1108483/windows-subsystem-for-linux-sources-list/1108488 Peter vor 7 Jahren 1
Ah, du hast recht ... aber jetzt bin ich mir nicht sicher, dass das mein Problem ist. Ich muss meine Frage bearbeiten Cody S vor 7 Jahren 0
Warum laufen Sie Windows Maven in Bash? Bash unter Windows läuft unter Linux und kann nur native Linux-Binärdateien ausführen. Sie können keine Windows-Exe-Dateien darin ausführen, im Gegensatz zu Cygwin, die zum Ausführen von Windows-Binärdateien verwendet werden phuclv vor 7 Jahren 1

3 Antworten auf die Frage

6
Argonauts

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/binund mvn so laufen willst, ./mvnwas passiert dann?

Was ist die Ausgabe ls -altin 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:

  1. 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.
  2. Stellen Sie sicher, dass Sie eine Linux-Binärdatei haben. Verwenden Sie dazu das Utilty-Readelf.
  3. 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 mvnvon einem beliebigen Verzeichnis aus (basierend auf Ihrer Anweisung, dass die direkte Ausführung im bin-Verzeichnis, ./mvn, funktioniert hat).

Die Datei ist ausführbar, aber es ist keine ELF-Datei ... aber was solls? Warum kann Cygwin diese Binärdatei ausführen, BUW jedoch nicht? Und wenn ich zu dem Verzeichnis navigiere, kann ich noch ./mvn ausführen, und es wird ausgeführt, und es befindet sich auf meinem Pfad, aber BUW weigert sich, es zu bestätigen. Warum hat es etwas mit PATH zu tun, eine ELF-Datei zu sein / nicht? Cody S vor 7 Jahren 0
Wie gesagt, Cygwin ist eine Windows-Umgebung und kann nur Windows-Apps ausführen. Bash ist eine Linux-Umgebung und kann nur native Linux-Apps ausführen. Sie sind getrennte Umgebungen. Kopieren Sie einfach eine App aus einer nativen Ubuntu-Installation und versuchen Sie, sie in bash aufzurufen. Sie wird problemlos ausgeführt. Sie können die Windows-App jedoch nicht in Bash ausführen. Wenn Sie eine echte Bash ausführen möchten, müssen Sie maven erneut für Linux einrichten phuclv vor 7 Jahren 0
Ich erhalte auch das Ergebnis "Keine ELF-Datei", obwohl ich Maven von einem anderen Linux-Rechner kopiert habe. Wenn ich mvn starte, bekomme ich keine Antwort. Im Windows Task-Manager wird ein Java-Prozess angezeigt, den ich letztendlich beenden muss, um in bash eine "Killed" -Antwort zu erhalten. Das gleiche Verhalten erhalte ich auch, wenn ich versuche, maven von "/ mnt / c / Program Files (x86) / Maven / bin" auszuführen. Irgendwelche Ideen? papadi vor 7 Jahren 0
0
Chris Bernard

Da es auf Ubuntu basiert, ist die eigentliche PATH-Datei " /etc/environment" (zeigt den Dateityp nicht an).

$ nano /etc/environmentist die einfachste Möglichkeit, die Datei zu bearbeiten. Sie werden so etwas sehen:

PATH = "/ usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games"

Sie können das Verzeichnis, das Sie vor dem Ende ausgewählt haben, nach dem letzten Verzeichnis mit einem zusätzlichen :Doppelpunkt (Doppelpunkt) hinzufügen, um es vom vorherigen Verzeichnis zu trennen.

Zuletzt müssen Sie die Datei " /etc/environment" ausführen . Dies kann erreicht werden, indem Sie Folgendes eingeben:

$ . /etc/environment 

Ich lief diese ein $ sudo -sund überprüfte mit $ env. Ich bin etwas zuversichtlich, dass der env-Befehl die sofortigen Änderungen anzeigen sollte, und ein Neustart sollte es abschließen, nachdem die ausgewählten Änderungen vorgenommen wurden.

Ich habe meine Frage mit einem Szenario bearbeitet, aber als ich ~ / pathTest zur Datei `/ etc / environment 'hinzugefügt habe, wurde meine Datei nicht zum Pfad hinzugefügt. Ihre Lösung funktioniert nicht. Cody S vor 7 Jahren 0
nicht ~ verwenden; benutze den vollständigen Pfad Rufen Sie es ab, indem Sie im rechten Verzeichnis pwd eingeben djsmiley2k vor 7 Jahren 0
Ich habe nicht Funktioniert immer noch nicht Sorry, ich kann sehen, wie das irreführend sein kann, aber nein, ich verwende keine ~ in meinen Env-Pfaden, ich erweitere sie immer Cody S vor 7 Jahren 0
Ich habe gerade eine Neuinstallation der Funktion durchgeführt und finde, dass meine Antwort nicht ausreicht und nur vorübergehend den Pfad für eine bestimmte Sitzung ändert. Ich suche noch etwas mehr. Entschuldigung Cody. Chris Bernard vor 7 Jahren 0
0
Roden Luo

Versuchen Sie es echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(beliebiger Name)

source ~/.bash_path

echo $PATH um zu sehen, ob sich etwas ändert

chmod +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_pathSie einfach die Zeile hinzu ~/.bashrc.

Kannst du dich anrufen /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?

Ich kann mit `/ mnt / c / Program \ Files / apache-maven-3.3.9 / bin / mvn` aufrufen, und ich habe das` bin` zum PATH hinzugefügt, aber ich kann `welches mvn immer noch nicht tun `erfolgreich, was für mich keinen Sinn macht. Cody S vor 7 Jahren 0
Seltsam. Um bei der Suche nach Antworten besser zu werden, können Sie den Linux-Alias ​​verwenden, um den Aufruf ein wenig zu vereinfachen. http://www.linfo.org/alias.html Roden Luo vor 7 Jahren 0