BASH unter Ubuntu unter Windows (AKA Linux Subsystem für Windows) 10 - Wie setze ich meinen PATH?

8

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 PATHUmgebung zu ändern Variable (in ~/.bashrc)

Nun, ich versuche das Gleiche mit BUW zu tun, aber soweit ich das beurteilen kann, wird die PATHVariable ignoriert (das Verzeichnis Maven bin zum Verzeichnis hinzufügen PATHund dann die which mvnRückgabe leer ausführen ). Gibt es einen Trick, den ich vermisse, oder muss ich meinen PATHin 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 ~/.bashrcAkte aufgenommen ... 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 das tue which mvn, werde ich leer und wenn ich aufrufe mvn, werde ich umgeleitet, um es apt-getzu 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
Cody S.
quelle
1
Bearbeiten Sie die C:\Users\%username%\AppData\Local\lxss\root\.bashrcDatei möglicherweise erst einmal, um einen Pfad hinzuzufügen?
Peter
@ Peter Dieses Verzeichnis existiert nicht (ich habe kein 'lxss' unter Local)
Cody S
1
Geben Sie es in die Adressleiste ein, Sie sollten es haben. Andernfalls zeigen Sie versteckte Systemordner an. Das Aktivieren versteckter Ordner reicht nicht aus. Siehe superuser.com/questions/1108483/…
Peter
Ah, du hast recht ... aber jetzt bin ich mir nicht sicher, ob das mein Problem ist. Ich muss meine Frage bearbeiten
Cody S
1
Warum führen Sie Windows Maven in Bash aus? 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, mit dem native Windows-Binärdateien ausgeführt werden
phuclv

Antworten:

6

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/binund versuchen, mvn so auszuführen, ./mvnwas passiert dann?

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

  1. 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.
  2. Stellen Sie sicher, dass Sie eine Linux-Binärdatei haben - verwenden Sie das Dienstprogramm readelf, um dies zu überprüfen.
  3. 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 mvnin einem beliebigen Verzeichnis (basierend auf Ihrer Aussage, dass die direkte Ausführung aus dem bin-Verzeichnis ./mvn funktioniert hat).

Argonauten
quelle
Die Datei ist ausführbar, aber es ist keine ELF-Datei ... aber was zum Teufel? Warum kann Cygwin diese Binärdatei ausführen, BUW jedoch nicht? Und wenn ich zu dem Verzeichnis navigiere, kann ich immer 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 das Sein / Nicht-Sein einer ELF-Datei etwas mit dem Verhalten von PATH zu tun?
Cody S
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 separate 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 in echtem Bash laufen möchten, müssen Sie maven erneut für Linux
einrichten
Ich erhalte auch das Ergebnis "Keine ELF-Datei", obwohl ich Maven von einem anderen Linux-Computer kopiert habe. Wenn ich mvn starte, bekomme ich keine Antwort. Im Windows-Task-Manager wird ein Java-Prozess angezeigt, den ich eventuell beenden muss, um eine "Killed" -Antwort in Bash zu erhalten. Ich bekomme auch genau das gleiche Verhalten, wenn ich versuche, maven über "/ mnt / c / Programme (x86) / Maven / bin" auszuführen. Irgendwelche Ideen?
Papadi
0

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 ä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 in Ihnen hinzu ~/.bashrc.

Können Sie von anrufen /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?

Roden Luo
quelle
Ich kann durch aufrufen /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvnund habe das binzum PFAD hinzugefügt , aber ich kann es immer noch nicht which mvnerfolgreich machen, was für mich keinen Sinn ergibt.
Cody S
Seltsam. Um bei der Suche nach Antworten besser zu werden, können Sie den Linux-Alias ​​verwenden, um den Aufruf etwas zu vereinfachen. linfo.org/alias.html
Roden Luo
0

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

$ nano /etc/environmentist der einfachste Weg, um 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 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:

$ . /etc/environment

Ich lief diese ein $ sudo -sund ü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.

Chris Bernard
quelle
Ich habe meine Frage mit einem Szenario bearbeitet, aber als ich der /etc/environmentDatei ~ / pathTest hinzugefügt habe , wurde meine Datei nicht zum Pfad hinzugefügt. Ihre Lösung funktioniert nicht.
Cody S
benutze nicht ~; Verwenden Sie den vollständigen Pfad. Holen Sie es sich durch Eingabe von pwd in das richtige Verzeichnis
djsmiley2kStaysInside
Ich habe nicht. Funktioniert immer noch nicht. Entschuldigung, ich kann sehen, wie irreführend das sein könnte, aber nein, ich verwende ~ nicht in meinen Env-Pfaden, ich erweitere sie immer
Cody S
Ich habe gerade eine Neuinstallation der Funktion durchgeführt und finde, dass meine Antwort nicht ausreicht und den Pfad für eine bestimmte Sitzung nur vorübergehend ändert. Ich suche nach etwas mehr. Entschuldigung Cody.
Chris Bernard