Доступ оболочки bash к переменной среды $ ProgramFiles (x86) - PullRequest
0 голосов
/ 30 ноября 2018

В оболочке bash я использую git-bash.exe, как мне получить доступ к переменной среды Windows 10 ProgramFiles (x86)?

Если я выполню printenv, я увижу ее в выводес указанным регистром, но попытки доступа к нему с помощью echo $ProgramFiles(x86), echo $ProgramFiles\(x86\) и echo $"ProgramFiles(x86)" не работают.

Я могу получить доступ к не-x86 версии этой переменной среды без каких-либо проблем, используя echo $PROGRAMFILES и выполнить соответствующее удаление двоеточия и обратную косую черту для пересылки замен, необходимых для его использования в обновлениях переменных среды PATH, например, PATH=$PATH:"/${PROGRAMFILES//:\\//} (x86)/Some App Path With Spaces/", за которыми следуют echo $PATH и printenv PATH, что подтверждает желаемый результат.Проблема в том, что я бы не стал составлять переменную среды ProgramFiles (x86), а мог использовать ее непосредственно при обновлении переменной среды PATH.

В том же ключе при попытке использовать Windows APPDATA [= C: \ Users \ \ AppData \ Roaming] переменная среды в обновлениях переменной среды PATH. Мне нужно иметь возможность заменить не только начальные двоеточие и обратную косую черту, но и последующие обратные косые черты косыми чертами.Использование echo ${APPDATA//:\\//} создает C/Users\<username>\AppData\Roaming, и я не знаю, как получить сопоставление символов в переменной среды bash и синтаксис замещения, чтобы охватить оба случая, чтобы получить необходимый C/Users/<username>/AppData/Roaming, необходимый для использования в обновлениях переменной среды PATH.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Относительно APPDATA: Программа cygpath может преобразовывать имена путей между Windows, Unix и «смешанными» соглашениями.Cygwin и Git для Windows поставляются с этим инструментом.Пример:

$ echo "$APPDATA"
C:\Users\me\AppDataRoaming\
$ cygpath -u "$APPDATA"
/c/Users/me/AppData/Roaming
$ cygpath -m "$APPDATA"
C:/Users/me/AppData/Roaming
$ cygpath -w "$APPDATA"
C:\Users\me\AppData\Roaming

«Смешанный» формат весьма полезен, потому что даже большинство программ для Windows и Git для Windows могут обрабатывать этот формат напрямую.

Назначение вывода cygpath переменнойработает так (обратите внимание на кавычки!):

$ XAPP=$(cygpath "$APPDATA")
$ echo "$XAPP"
$ cd "$XAPP"
0 голосов
/ 30 ноября 2018

Примечание: есть недостаток в процессе, описанном ниже.В частности, если для некоторой переменной среды задано многострочное значение, где одна из строк значений соответствует выражению sed, вы также захватите эту строку.Чтобы избежать этого, если у вас есть Python, вы можете использовать:

python -c 'import os; print(os.getenv("FOO(BAR)"))'

например.Это выведет None, если переменная не установлена, поэтому вы можете захотеть сделать ее более привлекательной: например, указать значение по умолчанию или использовать sys.exit(1), например, если переменная не установлена.(Но если у вас есть доступный интерпретатор Python, вы можете подумать о написании на Python, а не непосредственно в bash.)


Имена переменных в оболочке Unix (sh, bash и т. Д.), Включая переменные среды, ограниченык наборам символов, которые исключают скобки.В частности, "$FOO(BAR)" всегда анализируется как ссылка на переменную $FOO, за которой следует (BAR) как отдельное слово.Это справедливо даже для форм расширения в фигурных скобках, где отдельное слово (BAR) синтаксически недопустимо:

bash$ echo "${FOO(BAR)}"
bash: ${FOO(BAR)}: bad substitution

Тем не менее, возможно для установки таких переменных и доступа к ним, используя другиепрограммы.Например, используя Python I , установите FOO(BAR) в hello:

>>> import os
>>> os.environ["FOO(BAR)"] = "hello"
>>> import subprocess
>>> subprocess.call("bash")
bash$

Этот экземпляр bash не может напрямую получить доступ к переменной, но env печатает все переменные:

bash$ env | grep FOO
FOO(BAR)=hello

Если у вас есть env (возможно, у вас есть) и sed, вы можете объединить их для извлечения произвольных переменных:

bash$ setting="$(env | sed -n 's/^FOO(BAR)=//p')"
bash$ echo "$setting"
hello

При условии, что Windows Bash не имеетв любом особом случае, чтобы лучше обойти эту конкретную неловкость, этот же трюк должен работать для "ProgramFiles (x86)".

Подстановка нескольких обратных косых черт с прямой косой чертой

Вы в основном здесь: проблемаявляется то, что ваш шаблон выглядит специально для :\, но строки имеют несколько \ s без двоеточий.Лучше всего, вероятно, иметь программу или функцию, которая на самом деле понимает пути Windows, поскольку они не обязательно имеют буквы дисков на передней панели (см. https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats). Но этот шаблон работает для обратной косой черты:

bash$ v='a\b\c'
bash$ echo ${v//\\/\/}
a/b/c

Двойная косая черта означает «заменить все вхождения». Шаблон равен \\, что соответствует одному обратному слешу. Следующий слеш вводит заменяющую строку, которая является \/, что означаетодна косая черта (это также можно записать как просто /, но мне кажется, что это сложнее читать, как ни странно.)

Конечно, это не заменяет двоеточие в C:, поэтому нам нужен одинбольше подстановок. Вы не можете сделать это в одном ${...} расширении, поэтому хитрость заключается в том, чтобы добавить еще один:

bash$ v='C:\a\b\c'
bash$ echo ${v//\\/\/}
C:/a/b/c
bash$ v1="${v//\\//}"; echo ${v1/:/}
C/a/b/c

Поместите это в функцию оболочки, которую вы в конечном итоге можете сделать достаточно умной, чтобы справиться с ней.все допустимые пути, и таким образом вы можете использовать local для предотвращения утечки имени переменной v1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...