Вопрос или проблема
Я использую Windows Subsystem for Linux и выбрал Ubuntu. Но я не могу вызвать программу, установленную на Windows, поэтому я проверяю список переменных окружения в WSL, кажется, что пробелы заменяются двоеточиями при передаче переменных окружения в WSL.
Учитывая, что в WSL список переменных окружения является списком, разделенным двоеточиями. В Win32 это список, разделенный точками с запятой.
Я думаю, это причина, почему я не могу вызвать программу, установленную на Windows. Я проверил другой ноутбук, это явление не существует, и все работает нормально.
Мой вопрос:
- Почему возникает эта проблема?
- Как я могу это исправить?
Я думаю, у вас несколько проблем здесь.
- Выполнение программы бинарного формата Windows из WSL Linux Shell.
Вы запускаете Windows, так почему бы не запустить вашу программу из Windows CMD, .BAT файла или Powershell?.
В любом случае, убедитесь, что вы включили это в /etc/wsl.conf
[interop]
enabled=True
Обратите внимание: Эта опция доступна в Insider Build 17713 и новее.
- Почему проблема с путем, преобразованием пробелов в : ?
Я не знаю. В Linux пробелы в пути представлены:
\
(черта и пробел, внутри кавычек, или пробел, если кавычки не используются)
Так что я думаю, вам нужно заменить ваш PATH тем, что у вас, заменив:
d/ProgramFiles/VS_Code/Microsoft:VS:Code/bin
на:
d/ProgramFiles/VS_Code/Microsoft\ VS\ Code/bin
Пожалуйста, проверьте:
/etc/wsl.conf
У вас должно быть:
[interop]
appendWindowsPath=True
Пожалуйста, проверьте опции в [automount] разделе.
https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-per-distro-launch-settings-with-wslconf
Если вам нужно исправлять ваш PATH каждый раз, вы можете сделать скрипт, например, fixpath.sh:
#!/usr/bin/env bash
PATH=$(echo "$PATH" | sed "s/Microsoft:VS:Code/Microsoft\ VS\ Code/")
export PATH
Тогда вы запускаете:
source ./fixpath.sh
Удачи
Я нашел, что это происходит потому, что я использую OpenFoam, и когда переменная окружения PATH OpenFoam начинает действовать, она перестраивает переменную окружения PATH, соответствующая настройка в файле ~/.bashrc:
source /opt/openfoam8/etc/bashrc
Как показано на следующем скриншоте, OpenFoam перестраивает переменную окружения $PATH, используя двоеточие и пробел в качестве разделителя.
Ответ или решение
Когда вы используете Windows Subsystem for Linux (WSL) и пытаетесь вызвать программы, установленные в Windows, могут возникать проблемы с путями из-за разницы в разделителях переменных окружения. В Windows используются точки с запятой (;) в качестве разделителей, тогда как в WSL для Linux применяются двоеточия (:). В вашем случае, проблема заключается в том, что пробелы в путях оказываются замененными двоеточиями, что мешает корректному вызову программ.
Почему возникает проблема?
-
Неправильная обработка пробелов: Проблема связана с тем, как OpenFoam, который вы используете, управляет переменной окружения PATH. Когда вы вызываете
source /opt/openfoam8/etc/bashrc
, OpenFoam изменяет переменную PATH, используя двоеточия как разделители. Если в пути к программе есть пробелы, они могут некорректно обрабатываться, и вместо разделителей будут вставляться двоеточия. Это также связано с тем, что в Bash пробелы должны экранироваться, иначе они интерпретируются как конец аргументов. -
Разделители в Windows и WSL: Как упоминалось ранее, Windows использует разделители
;
, в то время как в Unix-подобных системах, включая WSL, используются:
. Это различие может приводить к несовместимости и ошибкам в путях, особенно если вы пытались перенести значения переменных окружения без учета этих особенностей.
Как исправить эту проблему?
-
Редактирование файла
~/.bashrc
: Вам нужно изменить конфигурацию OpenFoam, чтобы избежать проблем с переменной PATH. Это можно сделать, отредактировав файл~/.bashrc
или задав структуру PATH прямо в этом файле, чтобы избежать конфликта с установленными путями. Проверьте, как OpenFoam формирует переменную PATH, и постарайтесь избежать вставки значений с пробелами. -
Использование экранирования пробелов: Чтобы правильно указать пути с пробелами, используйте экранирование. Например, вместо
d/ProgramFiles/VS_Code/Microsoft:VS:Code/bin
, используйтеd/ProgramFiles/VS_Code/Microsoft\ VS\ Code/bin
. Это позволит Bash интерпретировать пробелы корректно. -
Изменение конфигурации WSL: Убедитесь, что вы добавили в файл
/etc/wsl.conf
следующее:[interop] enabled=True appendWindowsPath=True
-
Скрипт для автоматического исправления: Чтобы каждый раз не редактировать PATH вручную, вы можете создать скрипт
fixpath.sh
:#!/usr/bin/env bash PATH=$(echo "$PATH" | sed "s/Microsoft:VS:Code/Microsoft\ VS\ Code/") export PATH
После создания скрипта, каждую сессию WSL можно будет просто запускать команду:
source ./fixpath.sh
Заключение
Эта проблема, связанная с переменной окружения PATH и обработкой пробелов, может вызвать затруднения при работе с OpenFoam и другими программами. Важно учитывать различия между Windows и WSL, особенно в области форматирования путей и переменных окружения. Настройка конфигурации, аккуратное управление переменными и использование экранирования пробелов помогут вам избежать подобных ситуаций в будущем.