#bash #unix #scripting #curl #escaping
#bash #unix #сценарии #curl #экранирование
Вопрос:
Вот как у меня это есть в сценарии. Что плохого в экранировании этого?
"curl --fail $solrIndex/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>*:*</query></delete>'"
Вот как это выполняется:
curl --fail http://localhost:8080/solr/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>*:*</query></delete>'
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">17</int></lst>
</response>
curl: (6) Couldn't resolve host 'text'
Что работает:
$ curl --fail http://localhost:8080/solr/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>*:*</query></delete>'
<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader"><int name="status">0</int><int name="QTime">51</int></lst>
</response>
Ответ №1:
Сохраните команду в массиве вместо отдельной строки
cmd=(curl --fail $solrIndex/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>*:*</query></delete>')
И выполнить его с
"${cmd[@]}"
Комментарии:
1. Мне нужно передать его в качестве параметра, echoThenRun «что»?, what = «${cmd[@]}», «cmd[@]», cmd[@], $cmd[@], ${cmd[@]} не работают.
2. Это должно сработать:
echoThenRun() { local IFS='!'; echo "$*"; "$@"; }; echoThenRun "${cmd[@]}"
Ответ №2:
Почти никогда не следует заключать в кавычки всю команду целиком; приводите аргументы:
curl --fail "$solrIndex/update?commit=true" -H "Content-Type: text/xml" --data-binary '<delete><query>*:*</query></delete>'
Комментарии:
1. Я передаю cmd в качестве параметра функции. ctrl F curl в wiki.apache.org/nutch /…