Что означает "@ -" в PowerShell после конвейера? - PullRequest
1 голос
/ 18 июня 2020

В этом потоке StackOverflow предлагаемый ответ предоставляет команду magi c "stdin" строку '@-' для параметра команды.

# Create data as PS hashtable literal.
$data = @{ user = @{ name = "$Firstname $Lastname"; email = "$adUsername@mydomain.org" } }

# Convert to JSON with ConvertTo-Json and pipe to `curl` via *stdin* (-d '@-')
$data | ConvertTo-Json -Compress | curl.exe mydomain.zendesk.com/api/v2/users.json -d '@-' -H "Content-Type: application/json" -X POST -v -u myuser:mypass

Это работает как шарм, но что на самом деле означает строка magi c "stdin"?

Спасибо!

1 Ответ

4 голосов
/ 18 июня 2020
Параметр -d

curl дополнительно позволяет вам передавать данные через файл (его содержимое ), а не по прямому значению.

Итак Что касается различия guish прямых значений (по умолчанию) от значения, представляющего имя файла , имена файлов должны начинаться с префикса @ (что является общепринятым соглашением в мире Unix).

В мире Unix - - это часто используемое соглашение для представления stdin (стандартный ввод) в контекстах, где ожидаются имена файлов (в зависимости от контекста он также может представлять stdout (стандартный вывод).

Таким образом, @- фактически инструктирует curl прочитать аргумент -d из stdin , который в PowerShell (всегда) предоставляется через конвейер (|).

В вашей команде PowerShell @- должно быть в кавычках ('@-'), потому что @ без кавычек в начале аргумента является метасимвол , т.е. символ со специальным синтаксисом c значение (это выполняет несколько функций, включая splatting ).
В качестве альтернативы, вы можете экранировать только сам @: `@- (escape-символ PowerShell - `, так называемый обратный апостроф).

...