Как создать псевдоним ZSH (в WSL), который запускает vswhere.exe и выполняет путь с пробелами? - PullRequest
0 голосов
/ 22 февраля 2019

Я нахожусь в WSL (подсистема Windows для Linux) Я пытаюсь создать псевдоним для запуска vswhere.exe, который сообщит мне, где находится devenv.exe, а затем запустим его из моей оболочки ZSH.

path1 = "$ (vswhere.exe -property productPath -format value)"

echo $ path1

выводит: C: \ Program Files (x86) \ Microsoft Visual Studio \2017 \ Enterprise \ Common7 \ IDE \ devenv.exe

path2 = $ (wslpath -a "$ path1")

echo $ path2

выходные данные: / mnt / c/ Program Files (x86) / Microsoft Visual Studio / 2017 / Предприятие / Common7 / IDE / devenv.exe

$ path2 содержит именно то, что я хочу выполнить, за исключением того, что оно не заключено в кавычки.Если я возьму эту строку в консоли, скопирую, вставлю ее и заключу в кавычки вручную, VS выполнится правильно.

Примерно так: eval '/ mnt / c / Program \ Files \ (x86) / Microsoft \Visual \ Studio / 2017 / Enterprise / Common7 / IDE / devenv.exe '

выполняется: eval $ path2 завершается сбоем, поскольку в $ path2 есть пробелы.

Я пробовал это: path3= $ (printf% q $ path2 | sed -e 's / ^ M $ //')

echo $ path3

'mnt / c / Program \ Files \ (x86) /Microsoft \ Visual \ Studio / 2017 / Enterprise / Common7 / IDE / devenv.exe $ '

Содержит $ в конце строки.Попытка выполнить eval $ path3 завершается неудачно с:

zsh: нет такого файла или каталога: / mnt / c / Program Files (x86) / Microsoft Visual Studio / 2017 / Предприятие / Common7 / IDE / devenv.exe ^M

Обратите внимание на ^ M в конце.У меня закончились идеи по командам sed и тому подобному, чтобы сделать эту работу, и я уверен, что есть просто какая-то необычная команда regex или zsh / bash, чтобы сделать это правильно.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вам нужно процитировать расширение $path2.Вам не нужно eval.Вам нужно убрать задний возврат каретки, если он присутствует.Причина в том, что если wslpath выдает результат с окончанием строки DOS (\r\n), подстановка команды удаляет символ завершающей новой строки (\n), но не возврат каретки (\r)), который предшествует этому, оставляя его как обычный символ.

# Get the path
path2=$(wslpath -a "$path1")
# Strip the trailing carriage return, if present
path2="${path2%$'\r'}"
# Execute the program, quoting the expansion 
# to produce a single shell word for the command name.
"$path2"
0 голосов
/ 22 февраля 2019

Внимательно прочитайте справочное руководство bash .Помните о цитатах и о том, как их разумно использовать.

Вам следует подумать:

eval '"/mnt/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Enterprise/Common7/IDE/devenv.exe"'

Еще лучше, избавьтесь от этих пробелов в безумии системного каталога (MicroSoftбезумно использовать их) и иметь некоторые символические ссылки, такие как /mnt/c/Program_Files_x86 -> /mnt/c/Program\ Files\ (x86) и т. д. Как настроить это, оставлено читателю в качестве упражнения.

На самом деле, я бы порекомендовал иметь ваш $HOME/bin/ в вашей $PATH и поместите символическую ссылку на /mnt/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Enterprise/Common7/IDE/devenv.exe (я полагаю, это какая-то MicroSoft IDE) в вашей $HOME/bin/

Ваша жизнь будет проще, если вы избежите чумыпробелы (и некоторые другие странные символы, такие как *, (, ), [, ], ;, ? и т. д.) в именах файлов.Поскольку пробелы в командной строке связаны с globbing и расширением оболочки.

Кстати, я не могу понять, почему вам нужно использовать devenv.exe из скрипта Linux.ИМНШО, вам следует избегать использования IDE MicroSoft из скрипта Linux.Я действительно считаю, что вы должны избегать этого.См. этот ответ, он имеет отношение к вашей проблеме.Не используйте Linux, как вы используете Windows.Так что используйте Windows как Windows, и используйте Linux - а также WSL - как Linux (читайте о философии Unix ).

Что касается использования sed (или * 1041)* команда ...) потребуется некоторое время, чтобы прочитать справочную страницу sed (1) (а также printf (1) ).Эта документация достаточно ясна (но плотна).

...