Когда я пытаюсь запустить этот cmd через bash вот так
Баш-скрипт
mycommand = "curl $mycommand --url '${requestURL}'"
echo "Search Command $mycommand"
myresponse = "$(${mycommand})"
Выход
Search Command curl -v -X GET --header Authorization:'Bearer ---very long access token---' -s '
https://my-rest-services:443/mypath/someparameters'
* URL rejected: Bad hostname
* Closing connection
* URL rejected: Port number was not a decimal number between 0 and 65535
* Closing connection
Когда я запускаю команду Follow в строке cmd, она работает отлично и возвращает мой ответ в формате JSON.
curl -v -X GET --header Authorization:'Bearer ---very long access token---' -s '
https://my-rest-services:443/mypath/someparameters'
{myjson response}
@GordonDavisson, это очень хороший совет.. читай до конца
@GordonDavisson, можете ли вы дать мне фрагмент кода, который заставит его работать без eval, а также вернет json, который возвращает Curl, пожалуйста?
Есть ли причина сначала сохранить команду. а не просто использовать echo "Search Command curl $mSearchCommand --url '${requestURL}'"; mSearchResponse = "$(curl $mSearchCommand --url "$requestURL}")"
?
Я получаю ответ на поиск {"code":"401", "message":"Индекс строки вне диапазона: -1"}
О, я не заметил, что $mSearchCommand
также содержит синтаксис оболочки (что вызывает те же проблемы). Как установлена эта переменная и почему она находится в переменной, а не является просто отдельным параметром фактической команды?
Я проведу рефакторинг кода согласно совету и вернусь.
mSearchResponse = "$(curl -v --header Authorization:\'Bearer $accessTokenFromAuthResponse\' --url 'myfullurl')" возвращает >>>> Accept: / > Authorization:'Bearer > < HTTP/2 401 <<<
echo on $accessTokenFromAuthResponse возвращает полный токен.. что мне не хватает?..? $accessTokenFromAuthResponse — это данные.
Давайте продолжим обсуждение в чате.
Я изменил свой bash-скрипт, как показано ниже, и он начал работать. «eval» был способом его запуска.
mycommand = "curl $mycommand --url '${requestURL}'"
echo "Search Command $mycommand"
eval "$mycommand"
Изменить, согласно замечательному совету @Gordon, я добавляю лучший ответ.
Это то, что я сделал, чтобы все заработало.
function callingMyAPI {
requestURL = "$1"
accessTokenFromAuthResponse = "$2"
#My REQUEST
callingMyAPI=$(curl --header "Authorization: Bearer $accessTokenFromAuthResponse" $requestURL)
}
callingMyAPI "$url" $accessToken
Это сработало.
Пожалуйста, не используйте eval
для подобных вещей, он имеет тенденцию решать простые проблемы, но позже вызывает неожиданные странные проблемы, в частности, когда в ваших данных появляются неожиданные символы синтаксиса оболочки - и eval
анализирует (и, возможно, выполняет) их как оболочку. синтаксис. См. «Почему следует избегать eval в Bash и что мне следует использовать вместо этого?»
Вы можете просто оставить eval
и раскавычить последнюю строку.
mycommand = "curl $mycommand --url '${requestURL}'"
echo "Search Command $mycommand"
$myresponse
Не работало. Curl: (3) URL-адрес отклонен: неправильное имя хоста. Curl: (3) URL-адрес отклонен: номер порта не является десятичным числом от 0 до 65535. Curl: (3) URL-адрес отклонен: номер порта не является десятичным числом от 0 до 65535. 65535
Тот факт, что вы получили сообщение об ошибке от Curl, на самом деле показывает, что он работает, но у вас есть ошибка с вашим ${requestURL}
.
Не храните команды в переменных. Переменные предназначены для данных, а не для исполняемого кода. Если вам нужно хранить исполняемый код, используйте функцию, а для простых команд — массив. См. BashFAQ №50: «Я пытаюсь поместить команду в переменную, но в сложных случаях всегда терпит неудачу!» , «Почему оболочка игнорирует символы кавычек в аргументах, передаваемых ей через переменные?», и многие другие предыдущие вопросы. Но игнорируйте все предложения по использованию
eval
, это огромный магнит для ошибок.