在学校里,我们被布置了一个作业,要求我们将 ASCII 艺术打印到终端窗口中。输入是格式数据[x_coordinate, y_coordinate, char_ascii_value]
(没有不应打印任何字符的坐标数据)。我实际上这样做没有任何麻烦,但我想我只是懒得进入 for 循环并在每次没有字符数据时打印一个空白空间,然后转到终端中的另一行并执行相同的操作,等等。
所以我想,一定有更简单的方法!由于我们只能使用 POSIX 中的命令,是否有任何命令允许您将光标移动到终端中的特定位置?
tput
我遇到了名为and的命令,tput cup
它完全符合我的需要,但我不太确定它是否tput cup
在 POSIX 中。
PS 请不要将此视为某种作弊。我只是想找到一种让我的生活更轻松的方法,而不是无脑地编写代码。
答案1
答案2
tput
在 POSIX 中留下模糊和最小化,因为 X/Open Curses 中有更详细的规范:
- tput - 改变终端特性(POSIX)
- X/开放诅咒,第 7 期
似乎没有直接链接到后者的 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