将光标移动到终端窗口中特定位置的 Posix 命令

将光标移动到终端窗口中特定位置的 Posix 命令

在学校里,我们被布置了一个作业,要求我们将 ASCII 艺术打印到终端窗口中。输入是格式数据[x_coordinate, y_coordinate, char_ascii_value](没有不应打印任何字符的坐标数据)。我实际上这样做没有任何麻烦,但我想我只是懒得进入 for 循环并在每次没有字符数据时打印一个空白空间,然后转到终端中的另一行并执行相同的操作,等等。

所以我想,一定有更简单的方法!由于我们只能使用 POSIX 中的命令,是否有任何命令允许您将光标移动到终端中的特定位置?

tput我遇到了名为and的命令,tput cup它完全符合我的需要,但我不太确定它是否tput cup在 POSIX 中。

PS 请不要将此视为某种作弊。我只是想找到一种让我的生活更轻松的方法,而不是无脑地编写代码。

答案1

作为麦克塞夫解释说,POSIX 没有指定tput cup. POSIX确实指定tput但只是最低限度。也就是说,tput cup得到了广泛的支持!

定位光标的标准化方法是使用ANSI 转义序列。要定位光标,您可以使用类似的东西

printf "\33[%d;%dH%s" "$Y" "$X" "$CHAR"

它将$CHAR在行$Y和列处打印$X。更完整的解决方案是

printf "\337\33[%d;%dH%s\338" "$Y" "$X" "$CHAR"

这将恢复光标位置。

答案2

tput在 POSIX 中留下模糊和最小化,因为 X/Open Curses 中有更详细的规范:

似乎没有直接链接到后者的 HTML 版本(特别是命令行tput),但它更详细(大约两倍长)。引用X/Open Curses中的描述:

7319 When XCURSES is supported, this description for the tput utility replaces that in the XC
7320 specification.
7321 The tput utility uses the terminfo database to make the values of terminal-dependen
7322 capabilities and information available to the shell (see sh in the XCU specification); to clear
7323 initialize, or reset the terminal; or to return the long name of the requested terminal type. Th
7324 tput utility outputs a string if the capability attribute (capname) is of type string, or an integer i
7325 the attribute is of type integer. If the attribute is of type boolean, tput simply sets the exit statu
7326 (0 for TRUE if the terminal has the capability, 1 for FALSE if it does not), and produces n
7327 output.

该程序将检索任何来自终端数据库的值。您使用的大多数平台都提供 X/Open Curses 的实现。当然,细节可能有所不同。在某些平台上,您可能会遇到tput使用的版本术语帽名字而不是术语信息。但你不太可能在作业中遇到这种情况“POSIX”,并且无论如何,您都可以使用略有不同的词汇来实现相同的目标。

然而,两者都没有咒骂也不ANSI 转义序列是 POSIX 的一部分。转义序列在 ECMA-48 中标准化:

一般来说,POSIX 与其他标准没有太多重叠(相对于 C 标准,您会发现该规则的大多数例外)。同样,X/Open Curses 与 ECMA-48 没有太多重叠:该文档中没有详细说明转义序列的形式和内容。

严格来说,您不能仅使用 POSIX 来完成作业。您只能使用 POSIX 加上通常在您的系统上实现的相关标准分类来完成此操作。

tput诸如此类的应用程序(以及诸如 的库)的原因curses是提供一个层来隐藏实现之间的细节和不一致之处。 POSIX 只到此为止,并忽略了操作系统的大多数有趣的功能,例如用户管理、安全性,当然还有管理终端。即使使用转义序列,也有多种方法可以在各种终端上移动光标。这里有一些术语信息其中的摘要:

   carriage_return           cr     cr   carriage return (P*)
                                         (P*)

   column_address            hpa    ch   horizontal position
                                         #1, absolute (P)

   cursor_address            cup    cm   move to row #1 col-
                                         umns #2

   cursor_down               cud1   do   down one line

   cursor_home               home   ho   home cursor (if no
                                         cup)

   cursor_left               cub1   le   move left one space

   cursor_mem_address        mrcup  CM   memory relative cur-
                                         sor addressing, move
                                         to row #1 columns #2

   cursor_right              cuf1   nd   non-destructive

   cursor_to_ll              ll     ll   last line, first
                                         column (if no cup)

   cursor_up                 cuu1   up   up one line
                                         space (move right
                                         one space)

   parm_left_cursor          cub    LE   move #1 characters
                                         to the left (P)

   parm_right_cursor         cuf    RI   move #1 characters
                                         to the right (P*)

   restore_cursor            rc     rc   restore cursor to
                                         position of last

   row_address               vpa    cv   vertical position #1
                                         absolute (P)

   save_cursor               sc     sc   save current cursor
                                         position (P)

   tab                       ht     ta   tab to next 8-space
                                         hardware tab stop

                                         save_cursor

相关内容