Shell 这个管道如何使用printf--”$(类别“sed…”;工作
Shell 这个管道如何使用printf--”$(类别“sed…”;工作,shell,printf,Shell,Printf,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命令只是: printf '%x' 65537 这
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
命令只是:
printf '%x' 65537
这将把数字65537
打印为十六进制值(10001
)。然后,脚本使用壳管符号(|
)将该printf
命令的输出传递到第二个printf
命令:
printf -- "$(cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')"
在该命令中,-->
仅表示“在此之后没有cli选项”,用于确保在-->
之后看起来像选项的任何内容都不会被视为选项。命令的其余部分是一个shell$(…)
表达式,它将被括号内包含的命令的输出所替换:
cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')
它以一个开始,它只是将标准输入(…是上一个printf
命令的输出…)传递到stdoutput。下面的sed
命令包含两个表达式。第一个
s/^(.(.{2})*)$/0\1/
…匹配包含奇数位数的任何行,并在0
前面加上前缀,确保每行都有偶数位数。第二个表达式
s/(.{2})/\\x\1/g
将每两个字符(nn
)替换为\xnn
,这是一个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
我想你可能误读了你所问的剧本 在第一个示例中,
printf
命令只是:
printf '%x' 65537
这将把数字65537
打印为十六进制值(10001
)。然后,脚本使用壳管符号(|
)将该printf
命令的输出传递到第二个printf
命令:
printf -- "$(cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')"
在该命令中,-->
仅表示“在此之后没有cli选项”,用于确保在-->
之后看起来像选项的任何内容都不会被视为选项。命令的其余部分是一个shell$(…)
表达式,它将被括号内包含的命令的输出所替换:
cat | sed -E -e 's/^(.(.{2})*)$/0\1/' -e 's/(.{2})/\\x\1/g')
它以一个开始,它只是将标准输入(…是上一个printf
命令的输出…)传递到stdoutput。下面的sed
命令包含两个表达式。第一个
s/^(.(.{2})*)$/0\1/
…匹配包含奇数位数的任何行,并在0
前面加上前缀,确保每行都有偶数位数。第二个表达式
s/(.{2})/\\x\1/g
将每两个字符(nn
)替换为\xnn
,这是一个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
谢谢你清楚而精彩的解释。这真的很有帮助,现在我意识到“printf-”是如何工作的,是什么让我感到困惑。谢谢你清晰而精彩的解释。这真的很有帮助,现在我意识到“printf--”是如何工作的,是什么让我感到困惑。