Подтвердить что ты не робот

Bash переменные с пробелами

Я столкнулся с следующей проблемой в оболочке MinGW под окнами. У меня в /etc/profile следующее выражение:

export GIT_SSH="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"

Это не работает, когда я использую git fetch в локальном репозитории. Но если я это сделаю (старый метод dos), это работает:

export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe"

Мой вопрос:

Как я могу заставить его работать, используя пробелы в переменной?

Для целей тестирования вы можете имитировать что-то вроде этого (любой пример хорош):

export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe"
# and try to execute like this
$VAR

Есть ли решение для этого (кроме предыдущего)?

Приветствуются любые ссылки/подсказки.

Спасибо,

Юлиан

4b9b3361

Ответ 1

Выполните его следующим образом: "$VAR". Это одна из самых значительных ошибок в сценариях оболочки, поскольку строки всегда заменяются буквально, и любые содержащиеся пространства рассматриваются как разделители токенов, а не как символы строки. Подумайте о замене переменной как своего рода вставки кода во время выполнения.

Что действительно происходит при написании $VAR, так это то, что оболочка пытается выполнить двоичный /c/Program с первым аргументом Files/TortoiseGit/bin/TortoisePlink.exe.

Я изучил этот трудный путь, получив странную синтаксическую ошибку в большой оболочке script для конкретного ввода. Никакие другие языки, о которых я могу думать, могут жаловаться на синтаксические ошибки, если вход во время выполнения содержит специальные символы, но это характер сценариев оболочки, поскольку интерпретаторы команд, такие как bash и sh, интерпретируют код по строкам.

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

Ответ 2

Для справки, я решил аналогичную проблему для osx, инкапсулируя аргумент с экранированными цитатами. Это может быть не лучшее решение, но, похоже, оно работает.

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""

Ответ 3

Я решил эту проблему, добавив обратную косую черту для выхода из пространства:

/Program Files становится /Program\ Files

Пример:

export GIT_SSH=/c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe

Ответ 4

С Git 2.23 (Q3 2019, восемь лет спустя) GIT_SSH, установленный на /c/Program\ Files/TortoiseGit/bin/TortoisePlink.exe, будет... работать (для тех, кто все еще в Windows 7)!

См. commit eb7c786 (16 июля 2019 г.) от Йоханнеса Шинделина (dscho).
(Merged by Junio C Hamano -- [TG43] -- in commit a5194d8, 25 Jul 2019)

mingw: поддержка программ, содержащих пробелы в своих именах

В некоторых старых версиях Windows (например, Windows 7) функция CreateProcessW() на самом деле не поддерживает пробелы в своем первом аргументе, lpApplicationName.
Но он поддерживает передачу NULL как lpApplicationName, что позволяет определить приложение из (возможно цитируемого) первого аргумента lpCommandLine.

Давайте использовать этот трюк (если мы уверены, что первый аргумент совпадает путь к исполняемому файлу) для поддержки запуска программ, путь которых содержит пространства.

This fixes git-for-windows/git issue 692


Git 2.24 (Q4 2019) добавляет тест:

См. коммит 71f4960 (01 октября 2019 г.) автора Александра Милославского (SyntevoAlex).
(Merged by Junio C Hamano -- [TG412] -- in commit 424663d, 09 Oct 2019)

t0061: исправить тест для argv[0] с пробелами (только MINGW)

Первоначально тест был разработан для случая, когда пользователь сообщил, что установка GIT_SSH в файл .bat с пробелами в пути не удалась в Windows: git-for-windows # 692