Как работает этот конвейер с printf - "$ (cat | sed ...)"? - PullRequest
0 голосов
/ 26 февраля 2019

Что происходит в первом фрагменте с printf --?Как printf анализирует такую ​​команду и как выглядит окончательный стек вызовов?

$ printf '%x' 65537 | \
    printf -- \
    "$(cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')" \
    | openssl base64 -e
AQAB
$ printf '%x' 65537 | \
    cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g' \
    | openssl base64 -e
XHgwMVx4MDBceDAxCg==

1 Ответ

0 голосов
/ 27 февраля 2019

Я думаю, что вы, возможно, неправильно читаете сценарии, о которых вы спрашиваете.

В первом примере команда printf просто:

printf '%x' 65537

, которая будет печатать число65537 как шестнадцатеричное значение (10001).Затем сценарий использует символ оболочки (|) для передачи вывода этой команды printf во вторую команду printf:

printf -- "$(cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')"

В этой команде -- простоозначает «после этого нет никаких опций cli», что используется для того, чтобы после -- все, что выглядит как опция, не рассматривалось как опция.Остальная часть команды представляет собой выражение оболочки $(...), которое будет заменено выводом команд, содержащихся в скобках:

cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')

Она начинается с бесполезного использования cat , который просто передает стандартный ввод (... который является выводом из предыдущей команды printf ...) в stdoutput.Следующая команда sed содержит два выражения.Первый ...

s/^(.(.{2})*)$/0\1/

... соответствует любой строке, содержащей нечетное число цифр, и добавляет 0, гарантируя, что каждая строка имеет четное количество цифр.Второе выражение ...

s/(.{2})/\\x\1/g

Заменяет каждые два символа (nn) на \xnn, то есть код форматирования printf, который просит printf напечатать символ с заданным ASCIIзначение.

Выход второй команды printf затем передается по каналу openssl base64 -e, который генерирует в stdout кодировку base64 для всего, что было получено в stdin.


Итак, когда вы запускаете:

printf '%x' 65537 | \
    printf -- \
    "$(cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')" \
    | openssl base64 -e

Это становится:

echo 10001 | printf -- '\x01\x00\x01' | openssl base64 -e

Который выводит:

AQAB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...