Вопрос или проблема
Я использую этот метод, чтобы запускать .sh файлы в Проводнике Windows с помощью bash.exe:
"C:\Windows\System32\bash.exe" -c " \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"
Это работает отлично для файлов вне моего дистрибутива WSL2, однако для файлов, таких как \\wsl$\Ubuntu\home\davidg\example.sh
, я получаю Отказ в доступе
.
Из PowerShell я могу запустить bash.exe ./example.sh
из рабочей директории, и он выполняется без проблем.
Почему это происходит и как я могу это решить?
АПДЕЙТ:
Обходной путь заключается в том, чтобы запустить pushd \\wsl$\Ubuntu
из cmd.exe
и выполнить .sh файлы из смонтированного диска в Проводнике Windows вместо UNC-пути.
Это, похоже, работает, хотя я не совсем уверен, почему:
"C:\Windows\System32\bash.exe" -c "bash \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"
На сколько я понимаю, внешний вызов bash необходимо вызывать с -c
, так как есть последовательность команд. Вызов .sh файла извлекает выгоду из внутреннего вызова bash без опций командной строки (т.е. передавая только ссылку на файл с командой оболочки согласно справочной странице).
Ответ или решение
Решение проблемы "Permission Denied" при выполнении .sh файлов в WSL 2 через Windows Explorer
Введение
Проблема "Permission denied" при запуске .sh файлов на Windows Subsystem for Linux 2 (WSL 2) через Windows Explorer может возникнуть из-за различий в правовых системах и особенностей работы компиляции между Windows и Linux. В этой статье мы проанализируем проблему и предложим детальные решения.
Проблема
Исходя из вашего описания, вы используете следующую команду для запуска .sh файлов:
"C:\Windows\System32\bash.exe" -c " \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"
Эта команда работает для файлов вне дистрибутива WSL, но когда вы пытаетесь выполнить файл, расположенный по пути \\wsl$\Ubuntu\home\davidg\example.sh
, вы получаете сообщение об ошибке "Permission denied".
Анализ ошибки
Здесь важно учитывать, что WSL 2 и Windows имеют разные модели управления доступом. Доступ к файлам через UNC путь \\wsl$
может приводить к проблемам с правами доступа, поскольку Windows может не корректно обрабатывать настройки прав Linux.
Решения
-
Использование Pushd: Вы уже обнаружили обходной путь, используя команду
pushd \\wsl$\Ubuntu
и запуск скриптов из перемещения в этот каталог. Этот подход позволяет избежать проблем с разрешениями, так как вы работаете непосредственно с файловой системой, доступной для WSL. -
Корректное использование Bash:
Вариант вашего кода, который вы выделили как рабочий:"C:\Windows\System32\bash.exe" -c "bash \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"
Этот вариант действительно исправляет проблему с правами, так как добавление второго вызова
bash
позволяет корректно интерпретировать и выполнять команды внутри скрипта. -
Изменение прав доступа к скрипту: Убедитесь, что файл
example.sh
имеет необходимые разрешения для выполнения. Вы можете установить эти разрешения с помощью следующей команды в Bash:chmod +x ~/example.sh
Это позволяет исполнять файл без проблем.
-
Проверка настроек WSL: Убедитесь, что ваша версия WSL 2 актуальна. Вы можете проверить его версию с помощью команды:
wsl --list --verbose
-
Проверка настроек файловой системы: Проанализируйте, действительно ли файл существует по указанному вами пути и имеет ли он корректные атрибуты. Для этого можно использовать команду:
ls -l ~/example.sh
Заключение
Работа с WSL 2 через Windows Explorer может вызывать сложности из-за различий в управлении правами и особенностей сети. Однако, используя указанные выше методы, вы сможете успешно выполнить .sh файлы, избежав проблем с правами доступа. Рекомендуется использовать подход с pushd
для навигации и выполнения скриптов, а также внимательно следить за правами доступа и корректной версией WSL.