Gracias a la Actualización de aniversario, ahora tengo BASH en Ubuntu en Windows 10. Anteriormente, utilicé Cygwin y configuré Maven en Cygwin, (y lo puse a funcionar por completo), que consistió en gran medida en instalar Maven y luego modificar mi PATH
entorno. variable (en ~/.bashrc
)
Bueno, estoy tratando de hacer lo mismo usando BUW, pero por lo que puedo decir, la PATH
variable se ignora (agregando el directorio bin Maven al PATH
y luego ejecutando which mvn
retornos en blanco). ¿Hay algún truco que me falta o tengo que configurar mi PATH
diferente en BUW?
EDITAR:
Déjame ser específico. ¿Qué necesito hacer en el "???" paso para obtener pathTestScript.sh en el camino?
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!'
EDITAR 2:
Quiero ser muy claro con mi objetivo final real. Tengo un JDK y Apache Maven instalados en mi sistema en los lugares habituales. Tenía ambas cosas funcionando perfectamente bien en Cygwin. Ahora que BUW está fuera, quiero usarlos allí, pero no puedo entender cómo configurar mi entorno para ellos, ya que los cambios que hago en mi RUTA no parecen tener ningún efecto.
EDITAR 3:
Ok, ahora me preocupa que estoy en una persecución salvaje. Si lo hago echo $PATH
, me sale/mnt/c/Program\ Files/apache-maven-3.3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Eso es lo que espero. Eso es lo que puse en mi ~/.bashrc
archivo ... Luego lo hago ls /mnt/c/Program\ Files/apache-maven-3.3.9/bin
y obtengo
m2.conf mvn mvn.cmd mvnDebug mvnDebug.cmd mvnyjp
Pero cuando lo hago which mvn
, me quedo en blanco, y si invoco mvn
, me redirigen para usarlo apt-get
para instalarlo.
Entonces, el problema no es que la RUTA no se esté actualizando ... solo se está ignorando. ¿Hay alguna manera de hacer que preste atención a la RUTA? Si no, esta es una versión bastante débil de Linux (IMO)
EDITAR 4:
Se ha mencionado un par de veces, y sí, mi ejemplo de bofetadas olvidó marcar el archivo como ejecutable. En mi escenario del mundo real (con Maven), todos los archivos son ejecutables:
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
C:\Users\%username%\AppData\Local\lxss\root\.bashrc
archivo por ahora para agregar ruta?Respuestas:
Resumen de actualización
Los ejecutables en cuestión no son formato nativo de Linux (ELF), están compilados para Windows. Durante la expansión de ruta, bash verifica el número mágico del binario, si no coincide con ELF, no lo expone a través de la expansión de ruta. Sin embargo, bash para Windows incluía la capacidad de iniciar aplicaciones nativas de Windows desde el entorno de bash, por lo que la ejecución directa (sin expansión de ruta y posterior comprobación binaria) funciona bien.
La resolución es una adición de .bashrc basada en alias (o cualquier número de métodos alternativos para imitar la expansión de ruta evitando la evaluación de archivos bash) o la instalación de la versión de Linux.
Respuesta original
Permisos de archivo
Es posiblemente un problema de permisos del sistema de archivos cruzados. Si usted
cd /mnt/c/Program\ Files/apache-maven-3.3.9/bin
y trata de ejecutar mvn como,./mvn
¿qué pasa?¿Cuál es la salida de
ls -alt
ese directorio?Si el archivo no está marcado correctamente como ejecutable, no aparecerá como un "programa" en su ruta. Si se trata de un archivo binario y no está en formato 'linux' (ELF), tampoco aparecerá como una ruta ejecutable.
Si la ejecución directa de mvn no funciona (publique los resultados de ls), intente agregar permisos de ejecución
chmod ug+x mvn
Versión incorrecta instalada
¿Está seguro de que tiene instalada la versión nativa de Linux? La misma versión que usó con cygwin definitivamente no funcionará.
Puede verificar la compatibilidad binaria con
sudo apt-get install elf-binutils
el archivo y luego usar el comandoreadelf -a mvn
Si obtiene un error como 'No es un archivo ELF ...', entonces tiene su respuesta.Me acabo de dar cuenta de que no agregaste permisos de ejecución al script de shell de prueba en tu ejemplo, el cual (a menos que simplemente hayas olvidado enumerar el paso), explica completamente esa falla en particular.
Resumen:
Actualizar
El tema del camino era un arenque rojo; solo está intentando ejecutar un formato binario que no es compatible con el entorno de Linux en Windows.
En la superficie, los dos entornos (cygwin y bash en Windows) proporcionan una experiencia de usuario algo similar, pero la implementación y la compatibilidad binaria resultante son muy diferentes.
En pocas palabras: los formatos binarios de Cygwin y Linux no son compatibles. Debe instalar la versión nativa de Linux para ejecutarla desde bash en Windows. También puede compilarlo desde la fuente dentro del entorno bash en Windows; pero debido a la naturaleza del entorno de los primeros días, me preocuparía perseguir dependencias.
Breve descripción de los dos entornos:
Cygwin es efectivamente una capa de traducción que proporciona una API para llamadas al sistema que normalmente no están disponibles en sistemas que no son POSIX, lo que le permite compilar muchos programas escritos para ejecutarse en Linux en el entorno de Windows. Sin embargo, todavía se está ejecutando en un entorno 'windows': ese binario ahora solo funcionará en el entorno cygwin en windows. Esta capa de traducción y las bibliotecas asociadas permiten compilar el código fuente escrito en la API de Linux en el entorno cygwin y ejecutarlo en Windows. Los binarios creados de esta manera no se ejecutarán en Linux o Windows de forma nativa; solo en el entorno cygwin.
El entorno bash en ventanas proporcionado por canonical es muy diferente al de cygwin. Realmente 'recrea' un entorno para un programa que parece ser realmente Linux, es decir, las bibliotecas estándar están disponibles junto con las llamadas al sistema POSIX, sin requerir ninguna modificación en los archivos binarios. En muchos casos, un binario construido contra ubuntu se puede copiar directamente al entorno bash en Windows y ejecutarse sin problemas.
Para ser reconocido como un ejecutable válido en bash en Windows, debe estar en un formato binario nativo de Linux o un archivo de script marcado con el programa para interpretarlo (para un script de bash, #! / Bin / bash). Se habrá creado un binario nativo de Linux contra bibliotecas de Linux y llamadas al sistema. Bash confirma que algo es un ejecutable válido tanto al verificar los bits de permiso ejecutables como al verificar que el formato del archivo binario es compatible (una verificación de 'número mágico'). Si es un archivo binario y no está en formato ELF, no está expuesto al shell a través de la expansión de ruta.
Para hacer que este problema sea más difícil de aclarar, han agregado la capacidad parcial de iniciar aplicaciones nativas de Windows desde bash en Windows, pero claramente no abordaron la verificación del formato de archivo binario de expansión de ruta bash, o lo hicieron y es un error.
Segunda edición:
Aclaración sobre su pregunta:
Cuando lo ejecutas directamente (./mvn), pasa por alto la evaluación Bash y simplemente lo ejecuta. El entorno bash en Windows es lo suficientemente inteligente como para ejecutar ejecutables nativos de Windows, lo cual debe ser. No creo que un binario cygwin se ejecute correctamente desde bash, pero podría ser incorrecto: la documentación es escasa en este momento y no tengo un entorno de prueba accesible en este momento.
Solución alternativa que proporciona una capacidad equivalente al soporte de 'ruta':
Si de lo contrario está completamente satisfecho con la instalación de Maven (no hay otros problemas de compatibilidad, todo simplemente 'funciona'), pero tenerlo en el camino es importante, puede utilizar una solución simple que proporcionará una capacidad equivalente.
En su archivo .bashrc, agregue el siguiente alias:
Repita el equivalente para cualquier otro ejecutable en ese directorio al que desea acceder desde cualquier lugar dentro del entorno bash en Windows.
reinicie bash u obtenga el archivo, y luego
mvn
funcionará desde cualquier directorio (según su declaración de que la ejecución directa desde el directorio bin, ./mvn, estaba funcionando).fuente
Prueba
echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path
(cualquier nombre que quieras)source ~/.bash_path
echo $PATH
para ver si algo cambiachmod +x ~/pathTest/pathTestScript.sh
Para ejecutarlo directamente, debe agregar el derecho de ejecución al archivo.pathTestScript.sh
Si esto funciona, solo agregue la línea
source ~/.bash_path
en usted~/.bashrc
.¿Puedes invocar por
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
?fuente
/mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn
y agregué elbin
a la RUTA, pero todavía no puedo hacerlo conwhich mvn
éxito, lo que no tiene sentido para mí.Como está basado en Ubuntu, el archivo PATH real es "
/etc/environment
" (no muestra el tipo de archivo).$ nano /etc/environment
es la forma más fácil de editar el archivo. Verás algo como esto:Puede agregar el directorio que elija antes de las comillas finales, después del último directorio, con un
:
(dos puntos) adicional para delimitar del directorio anterior.Por último, debe ejecutar el archivo "
/etc/environment
"; Esto se puede lograr escribiendo:Me encontré con esto
$ sudo -s
y lo comprobé$ env
. Estoy algo seguro de que el comando env debería mostrar los cambios inmediatos, y un reinicio debería completarlo después de que se realicen los cambios seleccionados.fuente
/etc/environment
archivo, mi archivo no se agregó a la ruta. Tu solución no funciona.