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

-eecho-n 标志不是 shell 标准,并非所有 shell 都实现它们。一些 shells(包括您正在使用的那个)只是回应它们,就好像它们是普通参数一样。

printf 是 shell 标准。它会自动扩展其格式中的标准反斜杠转义码,并且仅在您告诉它时才打印换行符(通常通过在格式中放置 \n )。它还可以做很多其他有用的事情,比如将值填充到特定长度。