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
Есть ли решение для этого (кроме предыдущего)?
Приветствуются любые ссылки/подсказки.
Спасибо,
Юлиан
Ответы
Ответ 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