Вопрос или проблема
Я хочу запустить 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.