Terminal

將游標移動到終端視窗中特定位置的 Posix 命令

  • June 19, 2016

在學校裡,我們被分配了一項家庭作業,我們假設在該作業中將 ascii 藝術列印到終端視窗中。輸入是格式的數據[x_coordinate, y_coordinate, char_ascii_value](沒有不應列印任何字元的座標數據)。我實際上沒有任何麻煩,但我想我只是懶得進入循環並在每次沒有字元數據時列印一個空格,然後轉到終端中的另一行並做同樣的事情,等等.

所以我在想,一定有更簡單的方法!由於我們只能使用 POSIX 中的命令,是否有任何命令可以讓您將游標移動到終端中的特定位置?

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

PS請不要把它當作某種作弊。我只是想找到一種方法讓我的生活更輕鬆,而不是無腦編寫程式碼。

正如mikeserv解釋的那樣,POSIX 沒有指定tput cup. POSIX確實指定tput但僅是最低限度的。也就是說,tput cup被廣泛支持!

定位游標的標準化方法是使用ANSI 轉義序列。要定位游標,您可以使用類似

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

它將$CHAR在 line$Y和 column列印$X。一個更完整的解決方案是

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

這將恢復游標位置。

tput在 POSIX 中留下模糊和最小化,因為在 X/Open 詛咒中有更詳細的規範:

似乎沒有直接連結到後者的 HTML 版本(特別是 command-line 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使用termcap名稱而不是terminfo的版本。但是您不太可能在使用***“POSIX”***的作業中遇到這種情況,無論如何,您都可以使用稍微不同的詞彙來實現相同的目標。

然而,cursesANSI 轉義序列都不是 POSIX 的一部分。轉義序列在 ECMA-48 中標準化:

通常,POSIX 與其他標準沒有太多重疊(您會發現該規則與 C 標準相比的大多數例外情況)。同樣,X/Open 詛咒與 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

引用自:https://unix.stackexchange.com/questions/210325