답변1
커뮤니티의 대답은 올바른 방향으로 가고 있습니다.
tmux
원하는 형상(특정 행 수를 가정할 때 열 너비)으로 분리된 세션을 생성 할 수 있습니다 .
tmux new-session -d -s task-session -x WIDTH -y HEIGHT
그런 다음 명령을 실행하십시오.
tmux send-keys 'task' ENTER
명령 출력을 파일로 파이프하지 마십시오.
창을 tmux
파일로 덤프합니다.
tmux capture-pane -b temp-buffer -S -
tmux save-buffer -b temp-buffer output.txt
tmux delete-buffer -b temp-buffer
답변2
실제로 POSIX 표준에서는 환경 변수의 값이 COLUMNS
터미널 크기를 얻는 다른 방법보다 우선한다는 것입니다. 표준에서는 변수의 용도 중 하나를 "터미널이나 창보다 임의로 작은 영역에 데이터를 표시"하는 것으로 설명합니다.
이러한 다른 방법은 표준화되지 않았지만 일반적으로 최종 장치에 대한 파일 설명자를 엽니다 ioctl()
. 귀하의 프로그램은 표준 출력을 확인하지 않고 터미널 장치로 TIOCGWINSZ
가정하지만 이를 수행합니다 .isatty()
불행히도 일부 프로그램은 COLUMNS
환경 변수를 존중하지 않으며 귀하의 프로그램도 그 중 하나입니다. 대신, 자체적인 특별한 비표준 메커니즘, 즉 detection
구성 파일의 설정을 제공합니다.defaultwidth
더 슬픈 것은 이러한 작업이 환경 변수와 반대라는 것입니다 COLUMNS
. 그것들은 대안이 아니라 대체물입니다. detection
프로그램 사용을 중단 TIOCGWINSZ
하고 기본 상태로 돌아가려면 프로그램을 닫아야 합니다 . 그런 다음 defaultwidth
감지를 강제로 끄려면 값을 설정해야 합니다 . 설정되지 않은 경우 80, 0인 경우 65536입니다.
더욱 아쉬운 점은 detection
POSIX 표준 COLUMNS
과 LINES
변수가 서로 독립적으로 동작하는 것과 달리 너비와 높이 모두에 닫힘이 적용된다는 점이다. 따라서 defaultheight
강제 종료를 감지하려면 설정되지 않은 경우 24, 0인 경우 65536인 a도 살펴봐야 합니다 .
너할 수 있다, 또는 탐지를 종료하고 의사 터미널로 프로그램을 속이십시오.
tmux
모든 키 패딩과 중간 파일이 필요한 복잡한 방법입니다. Bernstein ptybandage
및 stty columns
(내부 의사 터미널의 경우)을 사용하는 것이 한 줄로 더 간단하며 프로그램이 실행되는 동안 실시간으로 표준 출력으로 출력됩니다.
ptybandage sh -c 'stty 열 40';
추가 읽기
- 번스타인, 다니엘(1996).
ptybandage
.DJB웨어. - 조나단 데보인 폴라드(2014).
ptybandage
.스낵 가이드. 소프트웨어.
답변3
다음은 아직 작동하지 않지만 약간의 수정을 통해 작동하게 할 수 있을 것 같습니다. 다음 명령은 taskwarrior를 실행하기 전에 새로운 tmux 세션을 생성하고 창 크기를 수정합니다.
tmux new -d -s s1
tmux split -v
tmux resize-pane -t s1 -y 5
tmux send-keys "task > output.txt" ENTER
sleep 1
tmux kill-session -t s1
cat output.txt