Невозможно экспортировать переменную среды в WSL - PullRequest
0 голосов
/ 20 марта 2020

Я чувствую, что у меня инсульт. В настоящее время я выполняю следующую команду экспорта в WSL:

export BROWSER=/mnt/c/Program\ Files/Mozilla\ Firefox/firefox.exe

, но WSL, похоже, не распознает, что $ BROWSER был перезаписан, поскольку продолжает работать без обратной косой черты:

echo $BROWSER
/mnt/c/Program Files/Mozilla Firefox/firefox.exe

Что вызывает следующую ошибку при запуске команды:

$BROWSER
bash: /mnt/c/Program: No such file or directory

Это ошибка в WSL? Или я допустил ошибку при установке переменных окружения?

РЕДАКТИРОВАТЬ:

Я также пробовал использовать кавычки вместо косой черты:

export BROWSER='/mnt/c/Program Files/Mozilla Firefox/firefox.exe'

1 Ответ

0 голосов
/ 21 марта 2020

Добро пожаловать в болезненный мир поведения оболочки, совместимой с POSIX.

Обратная косая черта в назначении «экранирует» пробелы. Это означает, что они не рассматриваются как пробелы, которые обычно заканчивают строку. Обратные слеши удаляются, потому что они служат своей цели. Это не имеет ничего общего с переменными среды. Так работает обратная косая черта в оболочке POSIX. Попробуйте echo a\ b\"c.

Затем, когда вы использовали $BROWSER, оболочка заменила эту переменную ссылкой на значение переменной. Затем он делит результат на значение переменной $IFS. Поскольку $IFS обычно содержит пробел, табуляцию и перевод строки, путь браузера был разбит на встроенные пробелы на три отдельные строки. Это можно увидеть, запустив printf "%s\n" $BROWSER.

. Решение состоит в том, чтобы заключить в кавычки расширение переменной, чтобы запретить расщепление $IFS. Другими словами, используйте "$BROWSER". Фактически, вы почти всегда должны размещать переменные в двойных кавычках.

...