Как мне избежать cmd с помощью опций и запроса?

#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 /…