簡體   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