특정 행/열에 커서를 놓고 첫 번째 좌표와 정렬된 상태로 유지되는 여러 줄 파일/명령을 인쇄하고 싶습니다.
tput clear
tput cup 5 15
ping www.google.com
열 15의 모든 후속 행이 출력됩니다. 실제로 첫 번째 줄은 올바르게 인쇄되지만 후속 줄은 왼쪽으로 재설정됩니다. 사용 tput
이나 다른 방법이 가능한가요 ?
답변1
한 가지 방법은 해당 위치에 탭 정지를 설정하는 것입니다.
trap 'tabs -8' EXIT INT TERM # restore to default tab stops every 8 columns
# upon exit or signal
tput tbc # clear tab stops
tput cup 5 15
tput hts # set one and only tab stop
printf '\r' # move back to the beginning of the line
printf '\t%s\n' foo bar baz
ping www.google.com | paste /dev/null -
이는 터미널의 동작에 영향을 미치며 예를 들어 일시 중지되었을 때 문제를 일으킬 수 있습니다.
@Thor cup
기반 접근 방식에 비해 장점은 더 적은 출력을 전송한다는 것입니다(300 보드 위성 링크를 사용하지 않는 한 실제로는 문제가 되지 않음). syslog와 같은 다른 프로세스도 터미널에 텍스트를 쓰는 경우 해당 동작이 더 우아해질 것입니다.
각 줄이 위치 15에서 시작하도록 하는 또 다른 방법은 각 줄의 접두사를 붙이는 것입니다 \r$(tput cuf 15)
.
tput cup 5 15
ping www.google.com | PREFIX=$(tput cr; tput cuf 15) awk '
{print ENVIRON["PREFIX"] $0}'
csr
스크롤 영역 설정 기능 도 참조하세요 .
사용된 경우 zsh
해당 항목도 참조하세요.zcurses builtin
답변2
예.
...문제의 프로그램 출력을 사후 처리할 필요가 없으며, (일부 프로그램처럼) 터미널 문자 장치가 아닌 파이프와 통신한다고 생각하기 때문에 동작을 변경하게 할 필요도 없습니다.
tput
필요한 기능을 제공하는 terminfo 함수가 없기 때문에 이 작업을 수행할 수 없습니다. 게다가 이 기능은특정한특정 클래스의 터미널, 즉 DEC VT 시리즈 터미널에 있는 여러 제어 시퀀스를 구현하는 터미널입니다.
하지만 그것은예가능한.
터미널 수가 적네요. 터미널 에뮬레이터에서는 DEC VT 및 해당 제어 시퀀스를 에뮬레이트하는 것이 널리 사용됩니다. 그러나 모든 터미널 에뮬레이터가 이에 필요한 특정 DEC VT 제어 시퀀스를 이해하고 구현하는 것은 아닙니다. 다음이 포함됩니다:
console-terminal-emulator
존재하다Nosh 도구 세트- X텀
- 지상파 용어
이러한 터미널에는 구성 가능한 DEC VT 개념이 있습니다.여유. 여백은 일반 출력의 스크롤 및 자동 여백 래핑 동작을 제어합니다. 터미널에는 DEC VT 개념도 적용되어 있습니다.원산지 모드. 이것은모드 설정설정할 때존재하다, 수익을 창출하다반품CUP 및 HVP 제어 시퀀스를 사용하여 절대 커서 위치 지정을 제어합니다. 마지막으로 그들은 구현합니다.모두최신 DEC VT 모델에서 제공되는 새로운 마진을 포함한 마진.
따라서 프로그램이 시작되거나 계속될 때:
- DECSTBM 제어 시퀀스를 실행하여 위쪽 및 아래쪽 여백을 설정합니다.
- DECLRMM 모드를 켜서 왼쪽 및 오른쪽 여백 메커니즘을 활성화합니다.존재하다.
- DECSLRM 제어 시퀀스를 실행하여 왼쪽 및 오른쪽 여백을 설정하십시오.
- DECOM 모드 켜기존재하다.
- 원점 모드를 켰을 때 여백을 벗어나는 경우를 대비하여 커서를 위치시키고, 원점 모드를 켰을 때 커서가 자동으로 이동하지 않습니다.
프로그램이 종료되거나 일시 정지되거나 종료되면 반대 작업을 수행하여 화면을 원래대로 되돌립니다. 또한 커서 주소 지정 모드를 사용하는 프로그램이 전체 화면의 크기가 아닌 여백 영역의 크기를 알 수 있도록 라인 규칙에 저장된 터미널 크기에 대한 정보를 올바르게 유지해야 합니다.
처음엔 이렇겠지
printf '\e[%d;%dr\e[?69h\e[%d;%ds\e[?6h\e[H'' 5 20 5 65 stty 행 15 열 60 핑 www.google.com printf '\e[?6l\e[s\e[?69l\e[r' stty 행 25 열 80스크립트가 종료될 때 정리 동작을 대폭 개선하고 행 규칙의 행과 열을 복원하는 데는 더 현명해야 합니다.옳은(간결함을 위해 내가 했던 것처럼 잘못된 가정을 하는 대신).
더 적은 기능을 위해 이러한 터미널 에뮬레이터는 위쪽 및 아래쪽 여백을 존중하지만 여기에 특별히 필요한 왼쪽 및 오른쪽 여백 메커니즘은 없습니다.
- UrxVT
- 위로
- 용어
- 퍼티
기본 화면 버퍼와 백업 화면 버퍼에 대해 여백을 별도로 설정해야 합니다. 따라서 커서 주소 지정 모드로 전환할 때 대체 화면 버퍼로 전환하는 프로그램은 이에 영향을 받지 않습니다. 이 그룹에는 NeoVIM과 같은 프로그램과 더 적은 수의 프로그램이 포함됩니다. 커서 주소 지정 프로그램아니요그러나 대체 화면 버퍼로 전환됩니다. 후자 그룹에는 Z 셸의 ZLE와 같은 항목이 포함됩니다.
추가 읽기
- VT420 프로그래머 참조 매뉴얼. EK-VT420-RM-002. 1992년 2월. 숫자.
- VT520/VT525 비디오 터미널 프로그래머 정보. EK-VT520-RM. 1994년 7월. 숫자.
- 문자 세트 인코딩을 위한 제어 기능.ECMA-48. 1991년. ECMA 인터내셔널.
- 정보 기술 - ODA(개방형 문서 아키텍처) 및 교환 형식: 문서 구조. T.412. ITU.
- 정보 기술 - ODA(개방형 문서 아키텍처) 및 교환 형식: 문자 콘텐츠 아키텍처. T.416. ITU.
- 정보 기술 - ODA(개방형 문서 아키텍처) 및 교환 형식: 문자 콘텐츠 아키텍처. ISO/IEC 8613-6:1994. 국제 표준화기구.
- https://unix.stackexchange.com/a/289871/5132
- https://unix.stackexchange.com/a/243320/5132
답변3
짧은 대답: 아니요.
tput cup
그러나 각 새 줄 앞에 하나를 내보내면 효과를 시뮬레이션할 수 있습니다. 예를 들면 다음과 같습니다.
i=5
tput clear
tput cup $i 15
ping google.com |
while read; do
tput cup $((++i)) 15
echo "$REPLY"
done
또는 단일 "명령"으로:
i=5; tput clear; tput cup $i 15; ping google.com |
while read; do tput cup $((++i)) 15; echo "$REPLY"; done
커서 작업의 복잡성에 따라 에서 이 작업을 수행할 수도 있습니다 ncurses
.배쉬 간단한 저주.