Я думаю, что вы, возможно, неправильно читаете сценарии, о которых вы спрашиваете.
В первом примере команда 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