Экранирование звездочки * в Bash на Windows

796
Tamlyn

Следующая команда работает в GNU Bash на FreeBSD, но не в Git Bash на Windows:

curl -X PUT https://example.com/_config/cors/origins -d '"*"' 

Предполагаемый результат - отправить PUTзапрос к https://example.com/_config/cors/originsтелу "*"(включая кавычки - это строка JSON).

Однако в Windows звездочка расширяется как глобус, даже если она находится в кавычках. Выдержка из --trace-asciiжурнала cURL:

0000: PUT / _config / cors / origins HTTP / 1.1 004f: ​​Пользователь-агент: curl / 7.30.0 008e: Длина контента: 13 00a2: Content-Type: application / x-www-form-urlencoded 00d3:  => Отправить данные, 13 байт (0xd) 0000: .editorconfig == Информация: загрузка полностью отправлена: 13 из 13 байтов 

( .editorconfigэто первый файл в текущем каталоге.)

Выход с обратной косой чертой ( '"\*"') передает обратную косую черту:

0000: PUT / _config / cors / origins HTTP / 1.1 004f: ​​Пользователь-агент: curl / 7.30.0 008e: Длина контента: 4 00a1: Content-Type: application / x-www-form-urlencoded 00d2:  => Отправить данные, 4 байта (0x4) 0000: "\ *" == Информация: загрузка полностью отправлена: 4 из 4 байтов 

Два обратных слеша также передают оба обратных слеша в запросе.

0000: PUT / _config / cors / origins HTTP / 1.1 004f: ​​Пользователь-агент: curl / 7.30.0 008e: Длина контента: 5 00a1: Content-Type: application / x-www-form-urlencoded 00d2:  => Отправить данные, 5 байтов (0x5) 0000: "\\ *" == Информация: загрузка полностью отправлена: 5 из 5 байтов 

Это ошибка?

1
Я опубликовал ответ, но когда вы говорите, что вы использовали две обратные косые черты, можете ли вы на самом деле редактировать свое сообщение, чтобы показать нам пример? Или, возможно, просто отредактируйте, чтобы показать все различные идеи / попытки, которые вы сделали? Это было бы полезно с точки зрения отладки. JakeGould 9 лет назад 0
Вы уверены, что Bash является виновником, а не завиток? Какой curl вы используете (нативная сборка или cygwin / msys one)? Некоторые версии libc для Windows будут расширяться * (но не другие глобусы) при синтаксическом анализе командной строки (от `GetCommandLine` до argc / argv) -> можете ли вы проверить с помощью cmd.exe (который передает командную строку без изменений), если можете тоже видишь "скуку"? mihi 9 лет назад 0
При использовании приглашения `cmd` я могу заставить его работать, передав` -d \ "* \" ` Tamlyn 9 лет назад 0
и когда вы пытаетесь `-d '\" * \ "'` в bash, это не работает? mihi 9 лет назад 0
Нет, это тоже отправляет обратную косую черту. Tamlyn 9 лет назад 0

1 ответ на вопрос

0
JakeGould

Try it like this idea based on escaping tips and ideas found on this site:

curl -X PUT https://example.com/_config/cors/origins -d "\*" 

Another idea comes from this answer on a similar question about sending data via a POST request. First create a “data” file called “data.txt” that simply contains the *. Then run this curl command:

curl -X POST -d @data.txt https://example.com/_config/cors/origins 

You could try that without the -X POST which sets the request method like this:

curl -d @data.txt https://example.com/_config/cors/origins