Несколько параметров в команде Powershell Bash / Zsh - PullRequest
1 голос
/ 16 апреля 2020

Невозможно выполнить следующую команду 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 it работы:

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 Ответ

2 голосов
/ 16 апреля 2020

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

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

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

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

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

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

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

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

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


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

...