Bash: неожиданный EOF при поиске соответствия
Я пытаюсь запустить конвейер BitBucket на удаленном центре обработки данных AWS Windows Server 2016.
image: python:3.5.1
pipelines:
custom: # Pipeline that only runs manually
default:
- step:
caches:
- pip
script: # Modify the commands below to build your repository.
- pip install awscli
- <-
aws ssm send-command
--document-name "AWS-RunRemoteScript"
--instance-ids "i-000000000000000"
--parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":[\'{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}\'],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}'
--timeout-seconds 600
--region us-east-2
Когда я пытаюсь запустить конвейер, я получаю следующую ошибку:
+ <- aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-000000000000000" --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":[\'{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}\'],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}' --timeout-seconds 600 --region us-east-2
bash: /opt/atlassian/pipelines/agent/tmp/bashScript5876925824407417765.sh: line 8: unexpected EOF while looking for matching `''
Я изучил синтаксис 2-3 раза, но не уверен, в чем именно проблема. Я не вижу лишних одинарных кавычек в команде. Любая помощь будет по достоинству оценена.
ОБНОВЛЕНИЕ 1:
@rici:
+ aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-0000000000000000" --parameters '{"sourceType":["S3"],"sourceInfo":['\''{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'\''],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\TOM"]}'
Error parsing parameter '--parameters': Invalid JSON: Expecting value: line 1 column 36 (char 35)
JSON received: {"sourceType":["S3"],"sourceInfo":['{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\TOM"]}
ОБНОВЛЕНИЕ 2:
+ aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-0000000000000000" --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}' --timeout-seconds 600 --region us-east-2
Error parsing parameter '--parameters': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSON received: {\"sourceType\":[\"S3\"],\"sourceInfo\":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}
1 ответ
В оболочке, внутри строки в одинарных кавычках обратная косая черта ничего не экранирует. Они просто обычные персонажи. Кроме того, вы можете объединить несколько заключенных в кавычки или не заключенных в кавычки сегментов строки, просто записав их вместе, пока пробел указан.
Так что если у вас есть:
'abc\'def\'ghi'
Ты получаешь:
- Сегмент с одинарными кавычками, состоящий из четырех символов a b c \. Второй ' завершает этот цитируемый сегмент.
- Символы без кавычек
- Обратная косая черта - экранированная (поскольку обратные косые черты экранируют кавычки вне сегментов, заключенных в одинарные кавычки)
- Символы без кавычек g h i
- И, наконец, бесподобный ", что приводит к сообщению об ошибке.
Поскольку обратные слэши - это обычные символы внутри строк в одинарных кавычках, вы, вероятно, не захотите использовать обратную косую черту перед двойными кавычками. Поэтому возможно, что вы стремитесь к тому, чтобы:
--parameters '{"sourceType":["S3"],"sourceInfo":['\''{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'\''],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\\\TOM"]}'
Обратите внимание на использование последовательности '\''
чтобы:
- закрыть сегмент с одинарными кавычками
- вставить одинарную кавычку
- открыть новый сегмент с одинарными кавычками
Поскольку невозможно поместить одну кавычку в строку, заключенную в одинарные кавычки, эта идиома довольно распространена, хотя часто записывается как '"'"'
,
Тем не менее, я не совсем убежден, что вы действительно должны заключать в кавычки sourceInfo
параметр. Если предполагается, что это JSON, одинарные кавычки недействительны, поэтому sourceInfo
значение параметра должно быть в двойных кавычках и двойные кавычки внутри этого строкового значения должны быть экранированы:
--parameters '{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\\\TOM"]}'