Shell 在 mac 上捕获光标终端位置的脚本会产生额外的字符
Shell script capturing cursor terminal position on mac produces extra characters
我将 https://askubuntu.com/questions/366103/saving-more-corsor-positions-with-tput-in-bash-terminal 中的答案用作 shell 脚本,这对我在终端上提取当前位置很有用。
extract_current_cursor_position () {
export
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
echo -en "3[6n" > /dev/tty
IFS=';' read -r -d R -a pos
stty $oldstty
eval "[0]=$((${pos[0]:2} - 2))"
eval "[1]=$((${pos[1]} - 1))"
}
extract_current_cursor_position pos1
extract_current_cursor_position pos2
echo ${pos1[0]} ${pos1[1]}
echo ${pos2[0]} ${pos2[1]}
但是,在 Mac 机器上,它会生成额外的 -en
,其中包含一些新行和空格,如下所示。
-en
-en
23 4
23 8
如何避免输出额外的 -en
和换行以及额外的空格
使用printf
代替echo -en
:
printf '3[6n' > /dev/tty
-e
和 echo
的 -n
标志不是 shell 标准,并非所有 shell 都实现它们。一些 shells(包括您正在使用的那个)只是回应它们,就好像它们是普通参数一样。
printf
是 shell 标准。它会自动扩展其格式中的标准反斜杠转义码,并且仅在您告诉它时才打印换行符(通常通过在格式中放置 \n
)。它还可以做很多其他有用的事情,比如将值填充到特定长度。
我将 https://askubuntu.com/questions/366103/saving-more-corsor-positions-with-tput-in-bash-terminal 中的答案用作 shell 脚本,这对我在终端上提取当前位置很有用。
extract_current_cursor_position () {
export
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
echo -en "3[6n" > /dev/tty
IFS=';' read -r -d R -a pos
stty $oldstty
eval "[0]=$((${pos[0]:2} - 2))"
eval "[1]=$((${pos[1]} - 1))"
}
extract_current_cursor_position pos1
extract_current_cursor_position pos2
echo ${pos1[0]} ${pos1[1]}
echo ${pos2[0]} ${pos2[1]}
但是,在 Mac 机器上,它会生成额外的 -en
,其中包含一些新行和空格,如下所示。
-en
-en
23 4
23 8
如何避免输出额外的 -en
和换行以及额外的空格
使用printf
代替echo -en
:
printf '3[6n' > /dev/tty
-e
和 echo
的 -n
标志不是 shell 标准,并非所有 shell 都实现它们。一些 shells(包括您正在使用的那个)只是回应它们,就好像它们是普通参数一样。
printf
是 shell 标准。它会自动扩展其格式中的标准反斜杠转义码,并且仅在您告诉它时才打印换行符(通常通过在格式中放置 \n
)。它还可以做很多其他有用的事情,比如将值填充到特定长度。