Переменные Bash с пробелами - PullRequest
       25

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

27 голосов
/ 28 апреля 2011

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

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

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

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

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

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

Спасибо

Юлиан

Ответы [ 3 ]

48 голосов
/ 28 апреля 2011

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

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

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

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

9 голосов
/ 04 сентября 2012

Для справки, я решил аналогичную проблему в OSX, заключив аргумент в экранированные кавычки.Возможно, это не лучшее решение, но, похоже, оно работает.

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\""
2 голосов
/ 28 марта 2017

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

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

Пример:

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

...