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/bin
e provi a far funzionare mvn in questo modo, ./mvn
cosa succede?
Qual è l'output di ls -alt
in 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:
- 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.
- Assicurati di avere un binario linux - usa il file utilty per verificare.
- 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 mvn
funzionerà da qualsiasi directory (in base alla tua affermazione che l'esecuzione diretta dall'interno della directory bin, ./mvn, funzionava).
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
file per ora per aggiungere il percorso?