在 shellscript (zsh) 中回顯複選標記
為什麼在執行我的 shellscript 時這個複選標記沒有正確列印,即使 echo 單獨輸出正確?
腳本:
#!/bin/sh YELLOW='\033[1;33m' NC='\033[0m' # no color echo "enter your provider's auth code" stty -echo read authcode oathtool --totp -b $authcode | xclip -i echo "${YELLOW}\u2714 code copied to clipboard${NC}"
終端輸出:\u2714 程式碼複製到剪貼板
獨立命令:
echo "\u2714 checkmark"
終端輸出: ✔複選標記
我的外殼是zsh 5.8 (x86_64-debian-linux-gnu) 使用rxvt-unicode-256color終端
你的 shebang 有
/bin/sh
,我懷疑/bin/sh
在zsh
你的系統上。zsh
不是 Debian 批准的sh
實現之一。無論如何,我建議不要在腳本中使用非標準sh
語法。sh
\u2714
不是標準echo
語法。它將(可能)$'...'
在 POSIX 標準的下一個主要版本中成為標準,但不在echo
or的參數中printf
,而且無論如何 Debian 的預設sh
實現 (dash
) 還不支持$'...'
。
\uXXXX
被zsh
’sprintf
(在格式參數或參數中%b
)、-r
aw 除外)和echo
(除非啟用-E
或bsdecho
啟用該選項)內置程序和其內部$'...'
(這是在其中引入這些\uXXXX
序列的第一個 shell$'...'
,$'...'
引號本身來自 ksh93)。
#! /bin/zsh -
如果您想zsh
在腳本中使用功能,請將shebang 更改為。然後,您可以使用更多 zsh 功能,例如:
print -P '%B%F{yellow}\u2714 whatever%f%b'
%F{yellow}
使用romptP
擴展擴展為終端的正確程式碼,以將前景顏色更改F
為黃色(並將%f
前景色重置為預設值,和%B
/%b
啟用 / 禁用粗體,如你的\033[1m
)。在
zsh
中,您還可以執行以下操作:IFS= read -rs 'authcode?enter auth code: '
發出提示並
s
更可靠地啟用 ilent 輸入。在任何情況下,例如 in
sh
,您都可能希望-r
並IFS=
避免read
破壞輸入。您也可以使用
set -o pipefail
該oathtool | xclip
管道被視為失敗,如果其中之一oathtool
或xclip
失敗(不僅僅是xclip
)。請注意,如果語言環境的字元編碼沒有 U+2714 字元,
zsh: character not in range
錯誤。在標準
sh
+ 實用程序語法中,語法應該是:#! /bin/sh - bold_yellow='\033[1;33m' nc='\033[m' # no color if [ "$(locale charmap)" = UTF-8 ]; then check_mark='\0342\0234\0224' else check_mark='[X]' fi saved_tty_settings=$(stty -g) trap 'stty "$saved_tty_settings"' EXIT ALRM TERM INT QUIT stty -echo printf >&2 "enter your provider's auth code: " IFS= read -r authcode && secret=$(oathtool --totp -b "$authcode") && printf %s "$secret" | xclip -i && printf '%b\n' "${bold_yellow}${check_mark} code copied to clipboard${nc}"
這裡對著色轉義序列進行硬編碼,並且僅當區域設置的charmap 為 UTF-8 時才對 U+2714 的 UTF-8 編碼進行硬編碼。
或者你可以這樣做:
check_mark=$(printf '\342\234\224' | iconv -f UTF-8 2> /dev/null) || check_mark='[X]'
如果它有一個(並且在系統上受支持),則
check_mark
在區域設置的charmap中獲取它,否則。GB18030 是我所知道的唯一具有 U+2714 的其他charmap。它也是 Unicode 的一種編碼,主要在中國使用(例如在Debian 的語言環境中)。UTF-8``[X]``zh_CN.gb18030