Как передать путь с пробелами в WSL для Windows Terminal

Вопрос или проблема

Я хочу запустить WSL в конкретном пути /mnt/c/Users/My User/repos. Мы можем использовать wsl.exe ~ для запуска в домашнем каталоге, но, похоже, я не могу передать другой путь.

Я могу обернуть путь в экранированную строку, но WSL не примет строку в качестве параметра по умолчанию, поэтому wsl.exe \"/mnt/c/Users/My User/repos\" не работает.

Нет опции -p или --path, которая принимает строку, и я смотрел в опции WSL
и ошибку/CLI справки WSL, но не нашел решения.

{
    "colorScheme": "One Half Dark",
    "commandline": "wsl.exe '/mnt/c/Users/My User/repos' -d Ubuntu-20.04",
    "icon": "\ud83d\udc40",
    "name": "Мой профиль терминала Windows",
    "tabTitle": "Терминал Windows"
}

Я пробовал с:

/mnt/c/Users/My\\ User/repos
'/mnt/c/Users/My\\ User/repos'
\"/mnt/c/Users/My\\ User/repos\"

и получил /bin/bash: /mnt/c/Users/My\ User/repos: Нет такого файла или каталога.

Я также пробовал /mnt/c/Users/My\ User/repos без кавычек, с одиночными кавычками ' и экранированными двойными кавычками \"
и парсер JSON говорит Недопустимый символ экранирования в строке. [jsonc(261)].

Это немного неинтуитивно и так же не задокументировано, как опция ~, но wsl --cd кажется тем, что вам нужно. На самом деле это принимает путь Windows, а не форму WSL/Linux. Итак:

wsl --cd "C:\Users\My User\repos"

Если вы используете интерфейс настроек терминала Windows, то он автоматически предоставит вам правильный формат кавычек в settings.json, что выглядит так:

{
  "commandline": "wsl --cd \"C:\\Users\\My User\\repos"",
  "name": "Имя профиля"
}

И для забавы, вот альтернативный, хакерский метод, который вам на самом деле никогда не следует использовать, так как опция --cd является не-хакерским, лучшим способом:

wsl --exec bash -c "cd /mnt/c/Users/My\ User/repos; exec bash"

Хотя это не лучший вариант для этого конкретного случая, он демонстрирует возможность редактировать окружение (PWD в данном случае) перед запуском оболочки. Это может быть полезно иногда.

Самостоятельный ответ

В конце концов, мне не удалось решить мою проблему так, как я намеревался, но это работает:

{
    "commandline": "wsl.exe -d Ubuntu-20.04",
    "startingDirectory": "%USERPROFILE%/repos",
}

Мне удалось решить это, используя короткие имена, генерируемые для имен файлов, не соответствующих формату 8.3. Вы можете получить короткое имя каталога или файла, перейдя в место нахождения интересующего элемента (например, для “Program Files” это будет “C:\”) в обычном командном терминале и запустив команду dir /x.

Пример, как получить короткое имя

Короткое имя можно использовать в переменной окружения PATH вместо имен каталогов или файлов, содержащих пробелы. Это имеет то преимущество, что необходимо указать только один путь, и он будет работать как в среде Windows, так и в WSL.

Ответ или решение

Чтобы запустить Windows Subsystem for Linux (WSL) в Windows Terminal с определённым путем, содержащим пробелы, существует несколько эффективных решений. В этом ответе будут рассмотрены наиболее удобные и корректные подходы, включая использование встроенных функций Windows и WSL.

1. Использование --cd параметра

Наиболее простым и интуитивно понятным вариантом является использование параметра --cd, который позволяет указать Windows-путь к директории. Это означает, что вам не нужно беспокоиться об экранировании пробелов в пути. В вашем случае команду можно записать следующим образом:

wsl --cd "C:\Users\My User\repos"

Это нормально работает, и Windows Terminal автоматически обработает пробелы в пути.

Если вы хотите использовать это в настройках профиля Windows Terminal, исправьте ваш settings.json файл, добавив следующий код:

{
    "commandline": "wsl --cd \"C:\\Users\\My User\\repos\"",
    "name": "My Windows Terminal Profile"
}

2. Использование переменной среды %USERPROFILE%

Если вы работаете с каталогом, который находится в профиле пользователя, можно воспользоваться переменной окружения %USERPROFILE%. Это позволяет избежать проблем с пробелами и ввести путь в более простом формате:

{
    "commandline": "wsl.exe -d Ubuntu-20.04",
    "startingDirectory": "%USERPROFILE%/repos"
}

3. Альтернативный способ с использованием коротких имён

Краткие имена файлов (или 8.3 имена) — это ещё один метод, который можно использовать при работе с путями, содержащими пробелы. Если вы хотите получить короткое имя для директории, например "My User", выполните следующую команду в командной строке Windows:

dir /x

Это покажет вам короткие имена для всех файлов и папок в текущем каталоге. После этого вы можете использовать это короткое имя в вашей команде:

wsl.exe /mnt/c/Users/MYUSE~1/repos

4. Использование команды exec

Хотя это не самый элегантный способ, можно также воспользоваться командой exec для выполнения нескольких команд:

wsl --exec bash -c "cd /mnt/c/Users/My\ User/repos; exec bash"

Этот вариант позволяет сначала выполнить cd, а затем запустить новый экземпляр bash, однако он менее предпочтителен по сравнению с другими методами и может быть использован в случае необходимости изменения текущей директории во время выполнения.

Заключение

Как видно, существует несколько способов запуска WSL с определённым путем, содержащим пробелы, в Windows Terminal. Использование параметра --cd — это самый простой и удобный метод. Кроме того, использование переменных среды и коротких имён файлов также может быть полезно в различных случаях. Помните, что правильное форматирование путей — это ключ к безошибочному старту ваших рабочих процессов в среде WSL.

Оцените материал
Добавить комментарий

Капча загружается...