Я пытаюсь использовать команду curl для доступа к URL-адресу http с восклицательным знаком ( !
) на своем пути. например:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
консоль отвечает с bash: ... event not found
.
Что здесь происходит? и какой будет правильный синтаксис, чтобы избежать восклицательного знака?
bash
quoting
special-characters
netbrain
источник
источник
Ответы:
Восклицательный знак является частью истории расширения в bash. Чтобы использовать его, он должен быть заключен в одинарные кавычки (например:)
'http://example.org/!132'
или непосредственно экранирован с помощью обратной косой черты (\
) перед символом (например:)"http://example.org/\!132"
.Обратите внимание, что в двойных кавычках, обратная косая черта перед восклицанием предотвращает расширение истории, НО обратная косая черта в этом случае не удаляется. Так что лучше использовать одинарные кавычки, чтобы вы не передавали буквальную обратную косую черту
curl
как часть URL.источник
"http://example.org/\!132"
фактически расширяется без интерпретации обратной косой черты (я полагаю, что это связано с требованиями соблюдения POSIX).\!
и двойные кавычки.|
и используется для создания канала. Если вы отправляете сценарии клиентам и не можете быть уверены, в какой оболочке они будут работать, вам нужно протестировать их все!Помимо ответа Даниэля, вы также можете просто полностью отключить расширение истории, если не используете его
set +H
.источник
Ctrl-R
), которые позволяют вам предварительно просматривать и редактировать свою команду, чтобы не слепо отмахиваться от команды,!-14
которой вы, хотя и были!-12
, к сожалению, оказалисьrm -rf *
. Быть в безопасности. Отключить расширение истории! Eschew!
!fc -14
. Но это правда, что вы можете сделать это без включения расширения истории. Лично я использую!$
и,!vi
иsudo !!
дажеgit add !vi:$
достаточно часто, чтобы оставить расширение истории включенным.Лично я бы делал одинарные кавычки, но для полноты я также отмечу, что, поскольку это URL, вы можете кодировать
!
как%21
, напримерcurl -v http://example.org/%21132
.источник
Это также может сделать
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
или же
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
Что работает, потому что bash объединяет смежные строки. Этот подход особенно полезен, когда у вас есть другие вещи, которые требуют расширения оболочки, поэтому вы не можете использовать одинарные кавычки для всей строки:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
символ используется для раскрытия истории в командной строке.так что это может быть проблемой в приглашении, но не в файлах сценариев оболочки.
как вы можете видеть, расширения истории работают даже в двойных кавычках.
источник
Я столкнулся с той же проблемой, и мое простое решение было использовать переменную:
Здесь простота заключается в том, что (1) он переносим между оболочками и командами (2) не требует знания escape-синтаксиса и кодов ASCII.
источник
Начиная с Bash 4.3, теперь вы можете использовать двойные кавычки для цитирования символа расширения истории:
источник
echo
, эхо, кажется, обрабатывает это по-своемуbash
версия не имеет ничего общего с расширением взрыва, это связано с тем, что в вашем примере за!
ним следует «конец строки», и это не позволяет оболочке пытаться его расширить. Попробуйте,echo "!Hello World"
и вы увидите, чтоbash
ответитbash: !Hello: event not found
. См. Руководство для более подробной информацииДля тех, кто использует git bash в Windows, принятый ответ от @DanielPittman работает. Однако вы должны заменить обратную косую черту (\) на прямую косую черту (/).
Например, в Unix это будет выглядеть примерно так:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Для окон это было бы что-то вроде этого (фокус на косой черте в части заголовка авторизации)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'
источник