Невозможно запустить следующую команду Bash / Zsh в Powershell:

$KeyPath = Join-Path -Path $this.Plate -ChildPath "install/tekton.key"
kubectl create secret docker-registry regcred `
    --docker-server="https://gcr.io" `
    --docker-username=_json_key `
    --docker-email="name@org.iam.gserviceaccount.com" `
    --docker-password="$(cat $KeyPath)"

Я получаю ошибку:

error: exactly one NAME is required, got 5
See 'kubectl create secret docker-registry -h' for help and examples

Если я запустил эту команду прямо в bash, она сработает:

kubectl create secret docker-registry regcred --docker-server="https://gcr.io" --docker-username=_json_key --docker-email="name@org.iam.gserviceaccount.com" --docker-password="$(cat ./tekton.key)"
1
Chris G. 16 Апр 2020 в 14:37

1 ответ

Лучший ответ

Я не знаю, является ли это причиной вашей проблемы, но есть две потенциальные проблемы :

  • Расширенное значение, содержащее пробелы, заставляет PowerShell заключать аргумент в двойные кавычки целиком при восстановлении командной строки за кулисами (в Windows):

    • Например, если $(cat $KeyPath) ($(Get-Content $KeyPath)) расширяется до one two, PowerShell пропускает "--docker-password=one two" за кулисами, не { {X4}}.

    • Изменяет ли это значение аргумента, зависит от того, как целевая программа анализирует свою командную строку - я не знаю, что делает kubectl.

      • Если вам все же нужно решить эту проблему, экранируйте заключительный " (двойные кавычки) с помощью `` '' (обратная кавычка, escape-символ PowerShell, чтобы PowerShell передавал ваш аргумент в исходной синтаксической форме :

        • --docker-password=`"$(cat ./tekton.key)`"
      • Обратите внимание, что в отличие от POSIX-подобных оболочек, таких как Bash и Zsh, вы обычно не заключаете ссылку на переменную или подвыражение в "...", чтобы передать его через безопасно; например, --foo=$someVar или --foo=$(Get-Date) работают нормально, даже если $someVar или вывод из Get-Date содержит пробелы или подстановочные знаки.

  • Если файл $KeyPath содержит несколько строк, строки объединяются с пробелами в аргументе:

    • Например, если файл содержит "a`nb`n" ("`n" является новой строкой), PowerShell передаст
      "--docker-password=a b ".

    • Напротив, POSIX-подобные оболочки, такие как Bash или Zsh, сохранят внутренние символы новой строки при обрезке (любого количества) завершающих единиц.


Примечание: обработка PowerShell встроенных двойных кавычек в аргументах, передаваемых во внешние программы, нарушена - см. это ответ.

2
mklement0 16 Апр 2020 в 12:14