繁体   English   中英

带有printf —“ $(cat | sed…)”的管道如何工作?

[英]How does this pipeline with printf — “$(cat | sed…)” work?

什么是在第一个片段回事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==

我认为您可能会误读您要询问的脚本。

在第一个示例中, 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

\\xnn替换每两个字符( nn ),这是一个printf格式代码,要求printf使用给定的ASCII值打印该字符。

然后,第二个printf命令的输出通过管道传递到openssl base64 -e ,后者在stdout上生成与stdin接收到的内容相同的base64编码。


因此,当您运行时:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM