Shell

哪些 shell 支持 ANSI-C 引用?例如 $‘string’

  • April 30, 2022

我有一個 shell 腳本,它使用以下內容在其輸出中列印一個綠色複選標記:

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

在閱讀了 Bash 的ANSI-C Quoting之後,我意識到我可以在設置顏色變數並從echo-e中刪除標誌時使用它。

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

這似乎很吸引人,因為這意味著無論是傳遞給 Bash 的內置echo還是外部 util /bin/echo(我在 macOS 上),消息都能正確列印。

但這是否會降低腳本的可移植性?我知道 Bash 和 Zsh 支持這種引用方式,但我不確定其他人。

$'…'是一個 ksh93 功能,它也存在於 zsh、bash、mksh、FreeBSD sh 和一些 BusyBox sh 版本中(BusyBox ash built with ENABLE_ASH_BASH_COMPAT)。它還沒有出現在 POSIX sh 語言中。沒有它的常見的類似 Bourne 的 shell 包括 dash(/bin/sh預設情況下在 Ubuntu 等中)、ksh88、Bourne shell、NetBSD sh、yash、pdksh 的派生而不是 mksh 和 BusyBox 的一些建構。

將反斜杠字母和反斜杠八進制解析為控製字元的一種可移植方法是使用printf. 它存在於所有符合 POSIX 的系統上。

esc=$(printf '\033') # assuming an ASCII (as opposed to EBCDIC) system
col_green="${esc}[32;01m"

請注意,它\e是不可移植的。它受到許多實現的支持,printf但不是由破折號¹中的一個實現支持。請改用八進制程式碼。

¹它在 Debian 和至少發布 0.5.8-2.4 的衍生產品中受支持,例如,從 Debian stretch 和 Ubuntu 17.04 開始。

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