Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 这个管道如何使用printf--”$(类别“sed…”;工作_Shell_Printf - Fatal编程技术网

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--”是如何工作的,是什么让我感到困惑。