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"]}'
Другие вопросы по тегам