Trabajo en sistemas de archivos Windows y Linux

Hay una serie de consideraciones que se deben tener en cuenta al trabajar entre sistemas de archivos Windows y Linux. En esta guía se describen algunas y se incluyen algunos ejemplos de interoperabilidad para combinar comandos basados en Windows y Linux.

Almacenamiento y rendimiento de archivos entre sistemas de archivos

Se recomienda no trabajar en los sistemas operativos con los archivos, a menos que tenga una razón específica para hacerlo. Para lograr la máxima velocidad de rendimiento, almacene los archivos en el sistema de archivos de WSL si está trabajando en una línea de comandos de Linux (Ubuntu, OpenSUSE, etc.). Si trabaja en una línea de comandos de Windows (PowerShell, símbolo del sistema), almacene los archivos en el sistema de archivos de Windows.

Por ejemplo, al almacenar los archivos de proyecto de WSL, haz lo siguiente:

  • Usa el directorio raíz del sistema de archivos de Linux: \\wsl$\Ubuntu-18.04\home\<user name>\Project
  • No use el directorio raíz del sistema de archivos de Windows: /mnt/c/Users/<user name>/Project$ o C:\Users\<user name>\Project.

Cuando vea /mnt/ en la ruta de acceso del archivo de una línea de comandos de WSL, significa que está trabajando desde una unidad montada. Por lo tanto, la unidad C:/ del sistema de archivos Windows (C:\Users\<user name>\Project) tendrá este aspecto cuando se monte en una línea de comandos de WSL: /mnt/c/Users/<user name>/Project$. Es posible almacenar los archivos de proyecto en una unidad montada, pero la velocidad de rendimiento mejorará si los almacena directamente en la unidad \\wsl$.

Visualización del directorio actual en el Explorador de archivos de Windows

Para ver el directorio donde se almacenan los archivos, abra el Explorador de archivos de Windows desde la línea de comandos mediante:

explorer.exe .

También puede usar el comando powershell.exe /c start .. Asegúrese de agregar el punto al final del comando para abrir el directorio actual.

Para ver todas las distribuciones de Linux disponibles y sus sistemas de archivos raíz en el Explorador de archivos de Windows escriba \\wsl$ en la barra de direcciones.

Visualización de archivos de proyecto en el Explorador de archivos de Windows

Distinción de mayúsculas y minúsculas en el nombre de archivo y el directorio

La distinción entre mayúsculas y minúsculas determina si las letras mayúsculas (FOO.txt) y minúsculas (foo.txt) se controlan como distintas (distinguen mayúsculas de minúsculas) o equivalentes (sin distinción entre mayúsculas y minúsculas) en un nombre de archivo o directorio. Los sistemas de archivos Windows y Linux controlan la distinción de mayúsculas y minúsculas de maneras diferentes: Windows no distingue mayúsculas de minúsculas y Linux sí las distingue. Obtenga más información sobre cómo ajustar la distinción de mayúsculas y minúsculas, especialmente al montar discos con WSL, en el artículo sobre el procedimiento de ajuste de la distinción de mayúsculas y minúsculas.

Interoperabilidad entre comandos de Windows y Linux

Las herramientas y los comandos de Windows y Linux se pueden usar indistintamente con WSL.

  • Ejecute las herramientas de Windows (por ejemplo, notepad.exe) desde una línea de comandos de Linux (por ejemplo, Ubuntu).
  • Ejecuta herramientas de Linux (por ejemplo, grep) desde una línea de comandos de Windows (por ejemplo, PowerShell).
  • Comparte las variables de entorno entre Linux y Windows. (Compilación 17063 o posterior)

Ejecución de herramientas de Linux desde una línea de comandos de Windows

Ejecuta los archivos binarios de Linux desde el símbolo del sistema de Windows (CMD) o PowerShell mediante wsl <command> (o wsl.exe <command>).

Por ejemplo:

C:\temp> wsl ls -la
<- contents of C:\temp ->

Los archivos binarios se invocan de esta manera:

  • Usan el mismo directorio de trabajo que el símbolo del sistema actual de CMD o PowerShell.
  • Se ejecutan como usuario predeterminado de WSL.
  • Tienen los mismos derechos administrativos de Windows que el terminal y el proceso de llamada.

El comando de Linux que sigue a wsl (o wsl.exe) se controla como cualquier comando que se ejecute en WSL. Funcionan cosas como sudo, canalizaciones y redireccionamientos de archivos.

Ejemplo de uso de sudo para actualizar la distribución de Linux predeterminada:

C:\temp> wsl sudo apt-get update

Después de ejecutar este comando, se mostrará el nombre de usuario predeterminado de la distribución de Linux y se te pedirá la contraseña. Después de escribir la contraseña correctamente, la distribución descargará las actualizaciones.

Combinación de comandos de Windows y Linux

Estos son algunos ejemplos de la combinación de comandos de Linux y Windows mediante PowerShell.

Para usar el comando de Linux ls -la para enumerar archivos y el comando de PowerShell findstr para filtrar los resultados de las palabras que contienen "git", combina los comandos siguientes:

wsl ls -la | findstr "git"

Para usar el comando de PowerShell dir para enumerar archivos y el comando de Linux grep para filtrar los resultados de las palabras que contienen "git", combina los comandos siguientes:

C:\temp> dir | wsl grep git

Para usar el comando de Linux ls -la para enumerar archivos y el comando de PowerShell > out.txt para imprimir esa lista en un archivo de texto denominado "out.txt", combina los comandos siguientes:

C:\temp> wsl ls -la > out.txt

Los comandos pasados a wsl.exe se reenvían al proceso de WSL sin modificaciones. Las rutas de acceso de archivo deben especificarse en el formato de WSL.

Para usar el comando de Linux ls -la para enumerar los archivos de la ruta de acceso del sistema de archivos de Linux /proc/cpuinfo mediante PowerShell, utiliza el siguiente comando:

C:\temp> wsl ls -la /proc/cpuinfo

Para usar el comando de Linux ls -la para enumerar los archivos de la ruta de acceso del sistema de archivos de Windows C:\Program Files mediante PowerShell, utiliza el siguiente comando:

C:\temp> wsl ls -la "/mnt/c/Program Files"

Ejecución de herramientas de Windows desde Linux

WSL puede ejecutar herramientas de Windows directamente desde la línea de comandos de WSL mediante [tool-name].exe. Por ejemplo, notepad.exe.

Las aplicaciones que se ejecutan de esta manera tienen las siguientes propiedades:

  • Conservan el directorio de trabajo como el símbolo del sistema de WSL (en la mayoría de los casos; las excepciones se explican a continuación).
  • Tienen los mismos derechos de permiso que el proceso de WSL.
  • Se ejecutan como el usuario activo de Windows.
  • Aparecen en el administrador de tareas de Windows como si se ejecutaran directamente desde el símbolo del sistema de CMD.

Los archivos ejecutables de Windows que se ejecutan en WSL se administran de forma similar a los ejecutables nativos de Linux; las canalizaciones, los redireccionamientos e incluso los procesos en segundo plano funcionan según lo previsto.

Para ejecutar la herramientas de Windows ipconfig.exe, usa la herramienta de Linux grep para filtrar los resultados de "IPv4", y usa la herramienta de Linux cut para quitar los campos de columna. Desde una distribución de Linux (por ejemplo, Ubuntu), escribe lo siguiente:

ipconfig.exe | grep IPv4 | cut -d: -f2

Vamos a probar un ejemplo de combinación de comandos de Windows y Linux. Abra la distribución de Linux (por ejemplo, Ubuntu) y cree un archivo de texto: touch foo.txt. Ahora usa el comando de Linux ls -la para enumerar los archivos directos y sus detalles de creación, además de la herramienta de Windows PowerShell findstr.exe para filtrar los resultados, de modo que solo se muestre el archivo foo.txt en los resultados:

ls -la | findstr.exe foo.txt

Las herramientas de Windows deben incluir la extensión de archivo, coincidir con el caso del archivo y ser ejecutables. Los no ejecutables, incluidos los scripts por lotes y comandos nativos de CMD como dir, se pueden ejecutar con el comando cmd.exe /C.

Por ejemplo, para enumerar el contenido del directorio C:\ del sistema de archivos de Windows, escribe:

cmd.exe /C dir

O bien usa el comando ping para enviar una solicitud de eco al sitio web microsoft.com:

ping.exe www.microsoft.com

Los parámetros se pasan al archivo binario de Windows sin modificar. Por ejemplo, el siguiente comando abrirá C:\temp\foo.txt en notepad.exe:

notepad.exe "C:\temp\foo.txt"

También funcionará lo siguiente:

notepad.exe C:\\temp\\foo.txt

Compartir variables de entorno entre Windows y WSL con WSLENV.

WSL y Windows comparten WSLENV, una variable de entorno especial creada para unir las distribuciones de Windows y Linux que se ejecutan en WSL.

Propiedades de la variable WSLENV:

  • Se comparte; existe en entornos de Windows y WSL.
  • Se trata de una lista de variables de entorno que se pueden compartir entre Windows y WSL.
  • Puede formatear variables de entorno para que funcionen correctamente en Windows y WSL.
  • Puede ayudar en el flujo entre WSL y Win32.

Nota:

Antes de la versión 17063, la única variable de entorno de Windows a la que podía tener acceso WSL era PATH, por lo que se podían iniciar ejecutables de Win32 desde WSL. A partir de 17063, WSLENV comienza a ser compatible. WSLENV distingue entre mayúsculas y minúsculas.

Marcas de WSLENV

Hay cuatro marcas disponibles en WSLENV que pueden influir en la forma en que se traduce la variable de entorno.

Marcas WSLENV:

  • /p: traduce la ruta de acceso entre las rutas de acceso de estilo de WSL/Linux y las rutas de acceso de Win32.
  • /l: indica que la variable de entorno es una lista de rutas de acceso.
  • /u: indica que esta variable de entorno solo debe incluirse al ejecutar WSL desde Win32.
  • /w: indica que esta variable de entorno solo debe incluirse al ejecutar Win32 desde WSL.

Las marcas se pueden combinar según sea necesario.

Obtenga más información sobre WSLENV, incluidas las preguntas más frecuentes y ejemplos de configuración del valor de WSLENV en una concatenación de otras variables de entorno predefinidas, cada una con una barra diagonal como sufijo seguida de marcas para especificar cómo se debe traducir el valor y pasar las variables con un script. En este artículo también se incluye un ejemplo para configurar un entorno de desarrollo con el lenguaje de programación Go, configurado para compartir una variable GOPATH entre WSL y Win32.

Deshabilitación de la interoperabilidad

Los usuarios pueden deshabilitar la capacidad de ejecutar herramientas de Windows para una única sesión de WSL mediante la ejecución del siguiente comando como raíz:

echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop

Para volver a habilitar los archivos binarios de Windows, sal de todas las sesiones de WSL y vuelve a ejecutar bash.exe o ejecuta el siguiente comando como raíz:

echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop

La deshabilitación de la interoperabilidad no se conservará entre sesiones de WSL: la interoperabilidad se habilitará de nuevo cuando se inicie una nueva sesión.