BASH su Ubuntu su Windows (sottosistema AKA Linux per Windows) 10 - Come posso impostare il mio PERCORSO?


8

Grazie all'Anniversary Update, ora ho BASH su Ubuntu su Windows 10. In precedenza, ho usato Cygwin e avevo installato Maven in Cygwin (e l'ho fatto funzionare completamente), che consisteva principalmente nell'installare Maven e quindi nel modificare il mio PATHambiente variabile (in ~/.bashrc)

Bene, sto cercando di fare la stessa cosa usando BUW, ma per quanto ne so, la PATHvariabile viene ignorata (aggiungendo la directory bin di Maven a PATH, e quindi eseguendo i risultati in which mvnbianco). C'è un trucco che mi manca o devo impostare PATHdiversamente in BUW?

MODIFICARE:

Lasciami essere specifico. Cosa devo fare nel "???" passo per ottenere pathTestScript.sh sul percorso?

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:

Voglio essere molto chiaro con il mio vero obiettivo finale. Ho un JDK e Apache Maven installati sul mio sistema nei soliti posti. Avevo entrambi funzionato perfettamente su Cygwin. Ora che BUW è uscito, voglio usarli lì, invece, ma non riesco a capire come impostare il mio ambiente per loro, dato che qualsiasi modifica apportata al mio PERCORSO non sembra avere alcun effetto.

EDIT 3:

Ok, ora sono preoccupato di essere a caccia di un'oca selvatica. Se lo faccio echo $PATH, ottengo/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Questo è quello che mi aspetto. Questo è quello che ho messo nel mio ~/.bashrcfile ... Poi faccio ls /mnt/c/Program\ Files/apache-maven-3.3.9/bine ottengo

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

Ma quando lo faccio which mvn, divento vuoto e, se invoco mvn, vengo reindirizzato per usarlo apt-getper installarlo.

Quindi il problema non è che il PERCORSO non viene aggiornato ... viene semplicemente ignorato. C'è un modo per farlo prestare attenzione al PERCORSO? Altrimenti, questa è una versione piuttosto debole di Linux (IMO)

MODIFICA 4:

È stato sollevato un paio di volte e sì, il mio esempio schiacciato ha dimenticato di contrassegnare il file come eseguibile. Nel mio scenario del mondo reale (con Maven), i file sono tutti eseguibili:

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

1
Forse modificare il C:\Users\%username%\AppData\Local\lxss\root\.bashrcfile per ora per aggiungere il percorso?
Peter,

@Peter Quella directory non esiste (non ho un 'lxss' sotto Local)
Cody S

1
Digitalo nella barra degli indirizzi, dovresti averlo. Altrimenti, mostra le cartelle di sistema nascoste. Abilitare le cartelle nascoste non è sufficiente. Vedi superuser.com/questions/1108483/…
Peter,

Ah, hai ragione ... ma ora non sono sicuro che questo sia il mio problema. Dovrò modificare la mia domanda
Cody S

1
Perché esegui Windows Maven in Bash? Bash su Windows funziona all'interno di Linux e può eseguire solo binari Linux nativi. Non è possibile eseguire i file exe di Windows in esso, a differenza di Cygwin che viene utilizzato per eseguire i binari di Windows nativi
phuclv,

Risposte:


6

Riepilogo aggiornamento

Gli eseguibili in questione non sono in formato nativo Linux (ELF), ma sono compilati per Windows. Durante l'espansione del percorso, bash controlla il numero magico del binario, se non è una corrispondenza per ELF, non lo espone tramite l'espansione del percorso. Tuttavia, bash per Windows includeva la possibilità di avviare applicazioni Windows native dall'ambiente bash, motivo per cui l'esecuzione diretta (senza espansione del percorso e successivo controllo binario) funziona correttamente.

La risoluzione è un'aggiunta .bashrc basata su alias (o qualsiasi numero di metodi alternativi per imitare l'espansione del percorso bypassando così la valutazione del file bash) o l'installazione della versione di Linux.


Risposta originale

Autorizzazioni file

È probabilmente un problema di autorizzazioni tra file system. Se tu cd /mnt/c/Program\ Files/apache-maven-3.3.9/bine provi a far funzionare mvn in questo modo, ./mvncosa succede?

Qual è l'output di ls -altin quella directory?

Se il file non è contrassegnato correttamente come eseguibile, non verrà visualizzato come "programma" sul percorso. Se si tratta di un file binario e non nel formato 'linux' (ELF), non verrà visualizzato come percorso eseguibile.

Se l'esecuzione diretta di mvn non funziona (pubblica i risultati ls), prova ad aggiungere le autorizzazioni di esecuzione chmod ug+x mvn

Versione errata installata

Sei sicuro di avere installato la versione nativa di Linux - la stessa versione che hai usato con Cygwin non funzionerà quasi sicuramente.

Puoi verificare la compatibilità binaria con sudo apt-get install elf-binutils poi sul file mvn, usa il comando readelf -a mvn Se ricevi un errore come 'Not an ELF file ... `allora hai la tua risposta.

Ho appena notato che non hai aggiunto le autorizzazioni di esecuzione allo script della shell di test nel tuo esempio, che (a meno che tu non abbia semplicemente dimenticato di elencare il passaggio), spiega completamente quel particolare errore.

Sommario:

  1. Assicurati che gli eseguibili nella directory bin di Maven siano impostati correttamente come eseguibili usando chmod. Pubblica l'output di ls -alt nella tua risposta.
  2. Assicurati di avere un binario linux - usa il file utilty per verificare.
  3. Eseguire di nuovo il test dello script della shell, ma questa volta contrassegnare il file eseguibile.

Aggiornare

Il problema del percorso era un'aringa rossa; stai solo cercando di eseguire un formato binario non compatibile con l'ambiente Linux su Windows.

In apparenza i due ambienti (cygwin e bash su windows) offrono un'esperienza utente in qualche modo simile ma l'implementazione e la conseguente compatibilità binaria sono molto diverse.

In conclusione: i formati binari di Cygwin e Linux non sono compatibili. È necessario installare la versione nativa di Linux per eseguirla da bash su Windows. Puoi anche compilarlo dal sorgente all'interno della bash nell'ambiente Windows; ma a causa della natura dei primi tempi dell'ambiente mi preoccuperei di inseguire le dipendenze.

Breve descrizione dei due ambienti:

Cygwin è effettivamente un livello di traduzione che fornisce un'API per le chiamate di sistema che in genere non sono disponibili su sistemi non POSIX, che consente di compilare molti programmi scritti per essere eseguiti su Linux nell'ambiente Windows. Tuttavia è ancora in esecuzione in un ambiente 'windows' - quel binario ora funzionerà solo nell'ambiente cygwin su windows. Questo livello di traduzione e le librerie associate consentono la compilazione del codice sorgente scritto sull'API Linux nell'ambiente cygwin e l'esecuzione su Windows. I binari costruiti in questo modo non funzioneranno su Linux o Windows in modo nativo; solo nell'ambiente cygwin.

L'ambiente bash su Windows fornito da canonical è molto diverso da cygwin. Effettivamente "ricrea" un ambiente per un programma che sembra essere effettivamente Linux - ovvero le librerie standard sono disponibili insieme alle chiamate di sistema POSIX - senza richiedere alcuna modifica ai binari. In molti casi un binario creato su Ubuntu può essere copiato direttamente nel bash nell'ambiente Windows ed eseguito senza problemi.

Per essere riconosciuto come eseguibile valido in bash su Windows, deve essere in un formato binario Linux nativo o un file di script contrassegnato con il programma per interpretarlo (per uno script bash, #! / Bin / bash). Un binario linux nativo sarà costruito su librerie linux e chiamate di sistema. Bash conferma che qualcosa è un eseguibile valido sia controllando i bit di autorizzazione eseguibili sia verificando che il formato del file binario sia compatibile (un controllo "numero magico"). Se è un file binario e non è in formato ELF, non viene esposto alla shell tramite l'espansione del percorso.

Per rendere questo problema più difficile da chiarire, hanno aggiunto una parziale capacità di avviare applicazioni Windows native da bash su windows, ma chiaramente non hanno affrontato il controllo del formato file binario dell'espansione del percorso bash - o lo hanno fatto ed è un bug.

Seconda modifica:

Chiarimento sulla tua domanda:

Quando lo lanci direttamente (./mvn) ignora la valutazione di Bash e la esegue. L'ambiente bash su Windows è abbastanza intelligente da avviare eseguibili nativi di Windows, che deve essere. Non credo che un binario cygwin si avvierebbe correttamente da bash, ma potrei essere errato - la documentazione è scarsa a questo punto e non ho un ambiente di test accessibile al momento.

Soluzione alternativa che offre funzionalità equivalenti al supporto del "percorso":

Se altrimenti sei completamente soddisfatto dell'installazione maven (nessun altro problema di compatibilità, tutto funziona semplicemente), ma averlo sul percorso è importante, puoi usare una soluzione alternativa che fornirà funzionalità equivalenti.

Nel tuo file .bashrc, aggiungi il seguente alias:

alias mvn='/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn'

Ripeti l'equivalente per tutti gli altri eseguibili in quella directory a cui vuoi accedere da qualsiasi parte all'interno dell'ambiente Windows.

riavvia bash o trova il file, quindi mvnfunzionerà da qualsiasi directory (in base alla tua affermazione che l'esecuzione diretta dall'interno della directory bin, ./mvn, funzionava).


Il file è eseguibile, ma non è un file ELF ... ma che diamine? Perché Cygwin può eseguire questo binario ma BUW no? E se navigo nella directory, posso ancora eseguire ./mvn, e si esegue, ed è sul mio percorso, ma BUW rifiuta di riconoscerlo. Perché l'essere / non essere un file ELF ha qualcosa a che fare con il comportamento PATH?
Cody S

come ho detto, Cygwin è un ambiente Windows e può eseguire solo app di Windows. Bash è un ambiente Linux e può eseguire solo app native Linux. Sono ambienti separati. Basta copiare alcune app da un'installazione Ubuntu nativa e provare a chiamarla in bash, funzionerà senza problemi. Ma non puoi eseguire l'app di Windows in bash. Se vuoi correre in un vero bash devi configurare di nuovo
Maven

Ottengo anche il risultato "Not an ELF file", anche se ho copiato Maven da un'altra macchina Linux. Quando eseguo mvn non ricevo risposta. Nel Task Manager di Windows appare un processo Java che alla fine ho bisogno di uccidere per ottenere una risposta "uccisa" in bash. Ottengo esattamente lo stesso comportamento se provo a eseguire maven da "/ mnt / c / Program Files (x86) / Maven / bin". Qualche idea?
papadi,

0

Prova echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(qualsiasi nome tu voglia)

source ~/.bash_path

echo $PATH per vedere se qualcosa cambia

chmod +x ~/pathTest/pathTestScript.sh Per eseguirlo direttamente, è necessario aggiungere il diritto di esecuzione al file.

pathTestScript.sh

Se funziona, aggiungi semplicemente la linea source ~/.bash_pathin te ~/.bashrc.

Puoi invocare /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?


Posso invocare /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvne ho aggiunto il binal PERCORSO, ma non riesco ancora a farlo which mvncon successo, il che non ha senso per me.
Cody S

Strano. Per migliorare mentre cerchi le risposte, puoi provare l'alias Linux per rendere l'invocazione un po 'più semplice. linfo.org/alias.html
Roden Luo,

0

Poiché è basato su Ubuntu, il file PATH attuale è " /etc/environment" (non mostra il tipo di file).

$ nano /etc/environmentè il modo più semplice per modificare il file. Vedrai qualcosa del genere:

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

È possibile aggiungere la directory scelta prima delle virgolette finali, dopo l'ultima directory, con un ulteriore :(due punti) da delimitare dalla directory precedente.

Infine devi eseguire il file " /etc/environment"; questo può essere realizzato digitando:

$ . /etc/environment

Ho eseguito questi $ sudo -se verificato con $ env. Sono abbastanza fiducioso che il comando env dovrebbe mostrare le modifiche immediate e un riavvio dovrebbe completarlo dopo aver apportato le modifiche selezionate.


Ho modificato la mia domanda con uno scenario, ma quando ho aggiunto ~ / pathTest al /etc/environmentfile, il mio file non è stato aggiunto al percorso. La tua soluzione non funziona
Cody S

non usare ~; usa il percorso completo.
Scaricalo

Non l'ho fatto Non funziona ancora. Scusami, posso vedere come potrebbe essere fuorviante, ma no, non uso ~ nei miei percorsi env, li espando sempre
Cody S

Ho appena effettuato una reinstallazione della funzione e trovo che la mia risposta non sia sufficiente e cambi temporaneamente il percorso per una sessione specifica. Sto cercando qualcosa in più. Scusa Cody.
Chris Bernard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.