Рейтинг:1

неверная ошибка имени переменной в WSL

флаг in

Подобный вопрос был задан без удовлетворительного ответа. Я установил kaldi на WSL, и при запуске скрипта я получаю эту ошибку, которая, по-видимому, связана с «Program Files».

sh: 1: экспорт: Files/WindowsApps/CanonicalGroupLimited.UbuntuonWindows_2004.2021.222.0_x64__79rhkp1fndgsc:/mnt/c/ProgramData/Oracle/Java/javapath:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/ c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program: неверное имя переменной

Одним из ответов было сделать ссылку «Программа» на «Файлы программы». Но это не удается: /mnt/c$ sudo ln -s /mnt/c/Программа «Program Files» ln: не удалось создать символическую ссылку «Программа» Создание ссылки на стороне Windows выполняется успешно, но не имеет никакого эффекта.

user535733 avatar
флаг cn
Отвечает ли это на ваш вопрос? [Почему я получаю эту ошибку, когда пытаюсь выполнить этот простой скрипт bash?](https://askubuntu.com/questions/506415/why-i-obtain-this-error-when-i-try-to-perform- этот-простой-bash-скрипт)
NotTheDr01ds avatar
флаг vn
@user535733 user535733 Это не похоже на дубликат этого вопроса *вообще*
muru avatar
флаг us
@ NotTheDr01ds, ты уверен? Помимо фактического используемого пути, эта ошибка в значительной степени дублируется там.
NotTheDr01ds avatar
флаг vn
@muru Я серьезно подумывал о том, чтобы изменить свой профиль на «Я использую Linux в 4 раза дольше, чем муру, но муру знает об этом в 4 раза больше, чем я». (т. е. Муру, ты молодец!). Но в этом случае я совершенно уверен, что связанный вопрос похож только на ошибку. Это было вызвано явно неправильным использованием команды `export`. Я могу ошибаться, но я чертовски уверен, что это проблема с цитированием переменных, которая приводит к сбою экспорта. Я уверен, что мы можем найти другой вопрос, который может быть лучшим «дублирующимся» кандидатом, но аспекты WSL также делают этот вопрос немного более «особенным».
NotTheDr01ds avatar
флаг vn
Кажется, это действительно почти точная копия [этого] (https://askubuntu.com/q/1215961/1165986), но на этот вопрос тоже нет хорошего ответа. Поскольку этот OP отказался от WSL для «чистой» Ubuntu, я не вижу, чтобы они когда-либо принимали ответ (они в значительной степени сказали это в комментарии). По этой причине я предлагаю закрыть предыдущий вопрос в пользу этого (или найти другой дубликат). Это необычно, но я видел случаи на сайтах Stack, где это делалось по таким причинам.
Greenonline avatar
флаг us
Пожалуйста, [изменить] и предоставьте ссылку на «похожий вопрос», на который вы ссылаетесь в своем вопросе.
Рейтинг:1
флаг vn

У меня есть подозрение, что это вызвано чем-то в вашем скрипте или файлах запуска (при условии, что ~/.bashrc или же ~/.профиль) неправильное цитирование ДОРОЖКА переменная. Поскольку WSL автоматически добавляет путь Windows к пути WSL, он добавляет некоторые элементы пути с «Program Files», что правильно.

Но это требует правильного цитирования переменных. Проверьте свой скрипт на использование $ПУТЬ и процитируйте его (или добавьте потенциально оскорбительные строки в свой вопрос, если вам нужна помощь в этом). Если вы не видите ничего подозрительного в скрипте, то также проверьте свой ~/.bashrc и ~/.профиль.

Изменить/обновить: я почти уверен, что оскорбительная строка будет в сценарии, который обрабатывается через бросаться (т.е. ш). Bash может справиться с этим без дополнительных кавычек:

> экспорт PATH=$PATH:новый путь
> эхо $?
0
> эхо $PATH
> # выводит правильный PATH, даже с пробелами в пути Windows

Тем не менее, запустить ш и попробуйте то же самое:

$ экспорт ПУТЬ=$ПУТЬ:новый путь
sh: 1: экспорт: Файлы/NVIDIA: неверное имя переменной
$ экспорт PATH="$PATH":новый путь
$ эхо $?
0
$ эхо $ ПУТЬ
# выводит правильный PATH, даже с пробелами в пути Windows

Существует также «повязочное» решение для отключения функции WSL, которая добавляет путь Windows к пути WSL/Linux. Вы можете сделать это, создав (или отредактировав, если он уже существует) /etc/wsl.conf и добавив следующие строки:

[взаимодействие]
appendWindowsPath = ложь

Затем остановите экземпляр с помощью wsl --завершить Ubuntu (предполагается имя дистрибутива по умолчанию) и перезапустите WSL.

это не хороший постоянное решение, ИМХО, поскольку это значительно затрудняет запуск приложений Windows (таких как VSCode), когда они не находятся на пути.

Лучше выяснить основную проблему и исправить ее в скриптах.

NotTheDr01ds avatar
флаг vn
@steeldriver Я думал об этом, но потом я подумал, что искаженный PATH может все еще встречаться в `~/.bashrc`, а затем, поскольку он экспортируется, будет выбран рассматриваемым скриптом (который, вероятно, работает под `sh` шебанг). Тем не менее, чем больше я думаю об этом, тем больше я верю, что проблема с цитированием, вероятно, заключается в рассматриваемом сценарии.
NotTheDr01ds avatar
флаг vn
@steeldriver Да, я упоминаю, что Windows *добавляет* путь к Windows в вопросе, но по какой-то причине также происходит некоторое *предварение* -- `/mnt/c/Program Files/WindowsApps/CanonicalGroupLimited.UbuntuonWindows_2004.2021.222. 0_x64__79rhkp1fndgsc` добавляется в начало, и это необычно для WSL. Вы правы, что WSL не должен делать эту часть.
NotTheDr01ds avatar
флаг vn
@steeldriver Я вижу путаницу - мое заявление было немного двусмысленным. Когда я сказал «добавление пути Windows к фактическому приложению Ubuntu UWP», я имел в виду этот путь к приложению (а не «путь Windows»). Отредактировано, чтобы попытаться устранить некоторую двусмысленность.
NotTheDr01ds avatar
флаг vn
@steeldriver К сожалению, я думал, что первый путь был добавлен в начале, но теперь я вижу, что вся ошибка является частью *добавленного* пути (включая путь UWP). Я отредактирую свой ответ, чтобы удалить эту часть. Спасибо!
флаг hr
Да, это токенизируется как `export PATH=все-до-первого-пробела все-до-следующего-пробела`, что эквивалентно `export PATH=все-до-первого-пробела`, за которым следует `экспорт все-до-следующего-пробела`. Другое решение состоит в том, чтобы просто убедиться, что `$PATH` указан в кавычках справа от назначения.
NotTheDr01ds avatar
флаг vn
@steeldriver * «Еще одно решение - просто убедиться, что $PATH указан в кавычках справа от задания». * Я считаю, что это именно то решение. Просто нужно найти оскорбительную строку и исправить ее, что будет делать ОП.
флаг hr
Кстати, ваше замечание о `sh` по сравнению с `bash` правильное - см. [Когда необходимы двойные кавычки?] (https://unix.stackexchange.com/a/68748/65304), в частности раздел о RHS присваивания в **Где можно опустить двойные кавычки** *Обратите внимание, что вам нужны двойные кавычки после `export`, потому что это обычная встроенная функция, а не ключевое слово. Это верно только для некоторых оболочек, таких как dash, zsh (в эмуляции sh), yash или posh; bash и ksh относятся к экспорту особым образом.*
Рейтинг:0
флаг aq

Я могу немного опоздать в игру здесь, но публикую это на случай, если кто-то еще наткнется на эту тему. У меня была такая же проблема с новой установкой WSL с использованием Ubuntu, и она была исправлена ​​​​простым запуском этих команд (от имени root) в WSL:

$ sudo apt update && sudo apt upgrade -y

Все, что мне нужно было сделать, это перезапустить терминал WSL после этого, и проблема исчезла. Надеюсь, это поможет кому-то!

Рейтинг:-1
флаг in

Я нашел ответ в https://arstechnica.com/civis/viewtopic.php?f=16&t=1472885 Вам нужно удалить пути Windows из $PATH, и вы делаете это, создавая /etc/wsl.conf со следующим текстом: [взаимодействие] appendWindowsPath = Ложь Затем закройте окно WSL, подождите 8 секунд и перезапустите.

NotTheDr01ds avatar
флаг vn
Да, я упомянул, что это часть проблемы в первом абзаце моего вчерашнего ответа, и дал опцию `wsl.conf` в качестве обходного пути, поэтому вы должны принять этот ответ. Также обратите внимание, что удаление пути Windows из WSL уменьшит его функциональность и полезность, поэтому вместо этого рекомендуется исправить ошибку цитирования в сценарии.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.