BASH en Ubuntu en Windows (AKA Linux Subsystem para Windows) 10 - ¿Cómo configuro mi RUTA?

8

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 PATHentorno. variable (en ~/.bashrc)

Bueno, estoy tratando de hacer lo mismo usando BUW, pero por lo que puedo decir, la PATHvariable se ignora (agregando el directorio bin Maven al PATHy luego ejecutando which mvnretornos en blanco). ¿Hay algún truco que me falta o tengo que configurar mi PATHdiferente 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 ~/.bashrcarchivo ... Luego lo hago ls /mnt/c/Program\ Files/apache-maven-3.3.9/biny 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-getpara 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
Cody S
fuente
1
Tal vez editar el C:\Users\%username%\AppData\Local\lxss\root\.bashrcarchivo por ahora para agregar ruta?
Peter
@ Peter Ese directorio no existe (no tengo un 'lxss' debajo de Local)
Cody S
1
Escríbelo en la barra de direcciones, deberías tenerlo. De lo contrario, muestre las carpetas ocultas del sistema. Habilitar carpetas ocultas no es suficiente. Ver superuser.com/questions/1108483/…
Peter
Ah, tienes razón ... pero ahora no estoy seguro de que ese sea mi problema. Voy a tener que editar mi pregunta
Cody S
1
¿Por qué ejecutas Windows Maven en Bash? Bash en Windows se ejecuta dentro de Linux y solo puede ejecutar binarios nativos de Linux. No puede ejecutar archivos exe de Windows en él, a diferencia de Cygwin, que se utilizan para ejecutar binarios nativos de Windows
phuclv

Respuestas:

6

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/biny trata de ejecutar mvn como, ./mvn¿qué pasa?

¿Cuál es la salida de ls -altese 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 comando readelf -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:

  1. Asegúrese de que los ejecutables en el directorio bin de maven estén configurados correctamente como ejecutables utilizando chmod. Publique la salida de ls -alt en su respuesta.
  2. Asegúrese de tener un binario de Linux: use el utilty readelf para verificar.
  3. Ejecute su prueba de script de shell nuevamente, pero esta vez marque el archivo como ejecutable.

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:

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

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 mvnfuncionará desde cualquier directorio (según su declaración de que la ejecución directa desde el directorio bin, ./mvn, estaba funcionando).

Argonautas
fuente
El archivo es ejecutable, pero no es un archivo ELF ... pero ¿qué diablos? ¿Por qué Cygwin puede ejecutar este binario pero BUW no? Y si navego al directorio, aún puedo ejecutar ./mvn, y se ejecuta, y está en mi camino, pero BUW se niega a reconocerlo. ¿Por qué ser / no ser un archivo ELF tiene algo que ver con el comportamiento PATH?
Cody S
Como dije, Cygwin es un entorno de Windows y solo puede ejecutar aplicaciones de Windows. Bash es un entorno Linux y solo puede ejecutar aplicaciones nativas de Linux. Son ambientes separados. Simplemente copie alguna aplicación de una instalación nativa de Ubuntu e intente llamarla en bash, se ejecutará sin problemas. Pero no puede ejecutar la aplicación de Windows en bash. Si desea ejecutar en real bash, debe configurar Maven para Linux nuevamente
phuclv
También obtengo el resultado "No es un archivo ELF", aunque copié maven de otra máquina Linux. Cuando ejecuto mvn no obtengo respuesta. Aparece un proceso de Java en el administrador de tareas de Windows que necesito matar eventualmente para obtener una respuesta "Asesinado" en bash. También obtengo exactamente el mismo comportamiento si intento ejecutar maven desde "/ mnt / c / Program Files (x86) / Maven / bin". ¿Algunas ideas?
papadi
0

Prueba echo 'PATH="~/pathTest/:$PATH"' > ~/.bash_path(cualquier nombre que quieras)

source ~/.bash_path

echo $PATH para ver si algo cambia

chmod +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_pathen usted ~/.bashrc.

¿Puedes invocar por /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvn?

Roden Luo
fuente
Puedo invocar /mnt/c/Program\ Files/apache-maven-3.3.9/bin/mvny agregué el bina la RUTA, pero todavía no puedo hacerlo con which mvnéxito, lo que no tiene sentido para mí.
Cody S
Extraño. Para mejorar mientras busca respuestas, puede probar el alias de Linux para simplificar un poco la invocación. linfo.org/alias.html
Roden Luo
0

Como está basado en Ubuntu, el archivo PATH real es " /etc/environment" (no muestra el tipo de archivo).

$ nano /etc/environmentes la forma más fácil de editar el archivo. Verás algo como esto:

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

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:

$ . /etc/environment

Me encontré con esto $ sudo -sy 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.

Chris Bernard
fuente
Edité mi pregunta con un escenario, pero cuando agregué ~ / pathTest al /etc/environmentarchivo, mi archivo no se agregó a la ruta. Tu solución no funciona.
Cody S
no use ~; usa la ruta completa. Consíguelo escribiendo pwd en el directorio correcto
djsmiley2kStaysInside
No lo hice Aún no funciona. Lo siento, puedo ver cómo eso puede ser engañoso, pero no, no uso ~ en mis caminos de env, siempre los amplío
Cody S
Acabo de reinstalar la función y descubro que mi respuesta no es suficiente y solo cambia temporalmente la ruta para una sesión en particular. Estoy buscando algo más. Lo siento, Cody.
Chris Bernard