Zsh

zsh 的 print -P 的轉義變數

  • February 6, 2022

我正在尋找一種方法來轉義包含格式說明符和特殊字元(如引號、反斜杠和換行符)的變數,以便在將其傳遞給print -P它時會按字面意思列印出來。

所以基本上我希望這兩個列印相同:

> cat file.txt
> my_var="$(cat file.txt)"
> print -P "${<magic>my_var}"

我使用的測試案例的一個很好的範例文件是:

Backslash \
Double Backslash \\

Single Quote '
Double Quote "

-----------------------
Escaped Linebreak \n
-----------------------

Color codes: %F{red}not red%f

Variable expansion $SHELL

我得到的最接近的是${${(q+)my_var}//\%/%%},儘管引號、換行符、反斜杠和變數擴展存在問題:

$'Backslash Double Backslash \

Single Quote '
Double Quote "

-----------------------
Escaped Linebreak \n
-----------------------

Color codes: %F{red}not red%f

Variable expansion /usr/bin/zsh'

我知道printf '%s\n' "$my_var"。但是在實踐中,print -P變數周圍有很多實際的格式,所以這對我沒有用。print -P遺憾的是,圍繞變數和實際變數使用printf也不起作用,因為在某些情況下,字元串操作被應用於變數的內容。

${(q)…}及其變體使用'…',"…"$'…'引號,但print -P不進行任何引號擴展,僅進行反斜杠擴展和提示擴展(這是百分比轉義擴展,如果prompt_subst啟用,則加上替換)。所以我認為${(q)…}在這裡幫不上忙。

禁用時,prompt_subst您需要保護反斜杠和百分號。啟用後,prompt_subst您還需要保護美元和反引號。

if [[ -o prompt_subst ]]; then
 print -P -- "${${${${my_var//\\/\\\\\\\\}//\%/%%}//\$/\\\\\$}//\`/\\\\\`}"
else
 print -P -- "${${my_var//\\/\\\\}//\%/%%}"
fi

引用自:https://unix.stackexchange.com/questions/689197