학교에서 우리는 ASCII 아트를 터미널 창에 인쇄해야 하는 과제를 받았습니다. 입력은 형식 데이터입니다 [x_coordinate, y_coordinate, char_ascii_value]
(문자를 인쇄해서는 안 되는 좌표 데이터 없음). 실제로 이 작업을 수행하는 데 아무런 문제가 없지만 for 루프에 들어가서 문자 데이터가 없을 때마다 공백을 인쇄한 다음 터미널의 다른 줄로 이동하여 동일한 작업을 수행하기에는 너무 게으른 것 같습니다. 것 등등
그래서 더 쉬운 방법이 있을 거라고 생각했어요! POSIX의 명령만 사용할 수 있는데 터미널의 특정 위치로 커서를 이동할 수 있는 명령이 있나요?
tput
나는 내가 필요한 것을 정확히 수행하는 명령을 발견했지만 그것이 POSIX에 tput cup
있는지 확실하지 않습니다 .tput cup
추신: 이것을 일종의 부정 행위로 간주하지 마십시오. 아무 생각 없이 코딩하지 않고도 내 삶을 더 쉽게 만들 수 있는 방법을 찾고 싶을 뿐입니다.
답변1
~처럼맥사이프POSIX가 지정되지 않았음을 설명합니다 tput cup
.확실히 지정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
X/Open Curses에 더 자세한 사양이 있으므로 POSIX에 난독화 및 최소화를 그대로 둡니다.
- 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