나는 최근에 tmux를 만지작거리며 많은 시간을 보내고 있는데 내가 뭘 잘못하고 있는지 알 수 없습니다. 제 생각에는 일부 레이아웃은 허용되지 않습니다. 오류나 경고는 발생하지 않지만 내 요청이 단순히 무시되는 것 같습니다. 이것이 내 목표입니다.
내가 달성할 수 있었던 것은 다음과 같습니다.
이것은 내가 실행 중인 쉘 스크립트입니다.
#!/bin/bash
SESSION=$USER
tmux -2 new-session -d -s $SESSION
tmux new-window -t $SESSION:1 -n 'Logs'
tmux split-window -h
tmux split-window -h
tmux split-window -v
tmux split-window -v
tmux select-pane -t 0
tmux resize-pane -L 100
tmux send-keys 'watch -n1 "cat /proc/cpuinfo | grep "MHz" | sort -r | head -32"' C-m
tmux select-pane -t 1
tmux resize-pane -L 100
tmux send-keys 'watch -n1 "cat /proc/cpuinfo | grep "MHz" | sort -r | tail -32"' C-m
tmux send-keys 'watch -n1 inxi -s' C-m
tmux select-pane -t 2
tmux resize-pane -U 50
tmux send-keys 'watch -n1 ${HOME}/bin/clean_sensors.sh' C-m
tmux select-pane -t 3
tmux send-keys 'watch -n1 rocm-smi' C-m
tmux select-pane -t 4
tmux resize-pane -U 7
tmux send-keys 'watch -n1 ${HOME}/bin/gpu_sensors.sh' C-m
# # Set default window
tmux select-window -t $SESSION:1
# Attach to session
tmux -2 attach-session -t $SESSION
편집하다: @KamilMaciorowski의 솔루션에 대한 결과는 다음과 같습니다.
창 개수는 정확하지만 상대적인 크기는 여전히 올바르지 않다는 것을 알 수 있습니다.
답변1
내 요청이 무시된 것 같습니다
어떤 요청이 무시되었는지는 확실하지 않습니다. 귀하의 스크립트는 저에게 어느 정도 작동합니다. tmux 서버를 실행하지 않고 다시 실행하면 아무것도 무시되지 않는 것 같습니다. tmux 서버가 이미 실행 중이면 문제가 있습니다.
- 세션이 이미 존재하고 누군가가 이를 (활성적으로) 사용 중일 수 있습니다.
- 창이 이미 존재할 수도 있습니다.
- 귀하의
split-window
명령은 다른 (기존) 창을 대상으로 할 수 있습니다.
제 생각에는 일부 레이아웃은 허용되지 않습니다.
기존 레이아웃을 사용하고 더 많은 작업을 수행하여 원하는 레이아웃을 얻는 것이 목표인 경우뒤쪽에, 그러면 원하는 오른쪽 상단 또는 오른쪽 하단 창을 쉽게 얻을 수 없기 때문에 어려울 것입니다.뒤쪽에왼쪽 "33%" 열 전체가 두 개의 "50%" 창으로 분할됩니다. 분할을 다른 순서로 수행해야 합니다.
순서를 이해하는 한 가지 방법은 종이에 레이아웃을 그린 다음 가위로 잘라내는 것입니다.똑바로줄이다통과하다, 따라서 각 컷은 현재 블록을 두 개의 작은 블록으로 분할합니다. 아니면 초콜릿 바를 깨뜨린다고 상상해 보세요.
원하는 레이아웃에 대한 가능한 시나리오는 다음과 같습니다.
+---------------------+
| 1 |
|22222221 |
| 3 1 |
| 3 1#############|
| 3 1 |
|22222221 |
| 1 |
+---------------------+
이 숫자는 절단해야 하는 순서를 나타냅니다. 로 표시된 컷은 #
오른쪽 열의 여러 컷을 나타내며 이전 1
, 이전, 이후 또는 이후 2
에 원하는 순서로 컷을 만들 수 있습니다 3
. 이러한 #
상처는 문제에 중요하지 않습니다. 중요한 것은 전후에 두 2
컷(순서 상관없이)을 해야 한다는 것입니다.1
앞으로 3
. 스크립트는 3
제작 없이 컷을 수행 2
하므로 원하는 것을 얻을 수 있는 직접적인 방법이 없습니다.
예 split-window -f
, 단일 창을 분할하는 대신 전체 창 높이 또는 전체 창 너비에 걸쳐 있는 새 창을 만듭니다. 어느 정도 유연성을 제공하고 창을 다른 순서로 생성할 수 있지만 이미 구현된 레이아웃에서 원하는 레이아웃을 얻는 데 도움이 되지 않으며 더 많은 레이아웃도 가능하지 않습니다.
비교해 보면 이것은 실제로 불가능한 레이아웃이라고 생각합니다.
+---------------------+
| # |
| # |
| ##############|
| | | |
| | | |
|---------------| |
| | |
+---------------------+
실제로 가위로 자를 수 있지만 tmux로는 자를 수 없습니다. 왜냐하면 적어도 가위를 사용한 첫 번째 패스에서는 두 개의 별도 시트를 만들기 위해 구부려야 하기 때문입니다. 첫 번째 컷 예시는 #
사람의 모습으로 그려졌습니다. 이것을 "통과"하지 않는 두 컷으로 해석할 수 있으므로 tmux의 경우 이 해석은 아무것도 변경하지 않으며 여전히 불가능합니다.
이것은 tmux 2.3에서 작동하는 샘플 스크립트입니다. 참고 사항 및 개선 사항은 코드 아래에 설명으로 나열되어 있으므로 스크립트를 실행하기 전에 읽어 보십시오.
#!/bin/sh
session="$USER"
window="$session:1"
lines="$(tput lines)"
columns="$(tput cols)"
tmux -2 new-session -d -x "$columns" -y "$lines" -s "$session" 'echo "step -1"; bash'
tmux new-window -t "$window" -n 'Logs' 'echo "step 0"; bash' || exit
tmux split-window -t "$window" -h -p 67 -d 'echo "step 1"; bash'
tmux split-window -t "$window" -v -p 10 -b -d 'echo "step 2a"; bash'
tmux split-window -t "$window" -v -p 22 -d 'echo "step 2b"; bash'
tmux split-window -t "$window" -h -p 50 'echo "step 3"; bash'
tmux split-window -t "$window.{top-right}" -v -p 55 -d
tmux split-window -t "$window.{top-right}" -v -p 64
tmux select-pane -t "$window.{bottom-right}"
tmux split-window -t "$window" -v -p 67
tmux split-window -t "$window" -v -p 50
tmux select-window -t "$window"
# Attach to session
tmux -2 attach-session -t "$session"
노트:
- 무엇보다도
/bin/sh
여기에는 Bash가 필요하지 않습니다. - 에 익숙해큰따옴표 변수. 필요하든 아니든 습관적으로 인용하는 것이 실제로 변화를 가져올 때 인용하는 것을 잊어버리는 것보다 훨씬 낫습니다.
- 나는 사용했다변수 이름 소문자.
- 나는 그것을
tput
현재 터미널의 크기를 결정하는 데 사용합니다. 그런 다음new-session -d -x … -y …
적절한 값을 사용하십시오. 하지만:- 초기 테스트에서는 이것이 불필요해 보였습니다. 이 모든 것은
-x
또는-y
... 없이 작동합니다. - ...내 지역 매뉴얼에 따르면 이것이 필요하긴 하지만.
- 그럼에도 불구하고 세션이 이미 존재하는 경우 해당 크기가 이미 결정되어
new-session -d -x … -y …
아무런 영향을 미치지 않습니다. 창을 연결하고 크기를 조정한 후 레이아웃 비율이 왜곡될 수 있습니다. 도움이 될 수 있는 몇 가지 tmux 명령과 옵션(resize-window
,window-size
, ) 이 있지만default-size
이전 tmux에는 해당 항목이 없으므로 자세히 설명하지 않겠습니다. tput
피연산자lines
이며cols
POSIX에서는 필요하지 않습니다. 바라보다이 답변교체.
- 초기 테스트에서는 이것이 불필요해 보였습니다. 이 모든 것은
- 창을 만들 수 없으면 스크립트가 종료됩니다.
- 각
split-window
대상은 오른쪽 창을 대상으로 합니다. 세션이 존재하거나 누군가가 동시에 연결하여 창을 변경하는 경우 현재 창은 사용자가 가정하는 창이 아닙니다. 더욱 강력해지려면 각 창을split-window
해당 창에 명시적으로 대상으로 지정해야 합니다. 많은 클라이언트가 동일한 tmux 서버와 상호 작용할 수 있는 일반 설정에서는select-pane
beforesplit-window
(또는 스크립트의 before) 가resize-pane
실제로 강력하지 않습니다. 일부 다른 클라이언트(사용자 또는 스크립트)는 다른 창에서 두 명령 중에서 선택할 수 있습니다. - 창 크기를 조정하지 않습니다. 먼저 적절한 비율로 만듭니다. 내가 사용하는 옵션은
-p
이전 tmux에서 작동합니다.문서새로운 구문이 비슷split-window -l 20%
하고resize-pane
백분율도 사용할 수 있다고 말해 주세요. 최신 tmux가 그것을 이해할 수 있을지 모르겠습니다split-window -p
. 문서에는 더 이상 이 옵션이 언급되지 않으며, 더 이상 사용되지 않거나 지원되지 않을 수도 있고, 호환성을 위해 유지될 수도 있습니다. 이를 테스트할 수 없습니다(피드백 또는 편집 환영). split-window
새 창을 위한 공간을 만들기 위해 축소될 창의 이전 크기인 사용 가능한 공간의 백분율을 사용합니다(적어도 이전 tmux에서는 작동하는 방식입니다-p
). 그래서22
이런 숫자가 있는 것입니다( 20/(20+70) ≒ 22 ). 문서에 따라 창 크기의 백분율을 사용하십시오resize-pane
.-d
다음 창에 필요한 사항에 따라 현재 창에 머물거나 새 창을 현재 창으로 만드는 데 사용하거나 사용하지 않습니다split-window
.- 토큰에 맞는 창을 지정/선택해야 할 때
{top-right}
토큰을 사용합니다 . - 명령을 실행하는 데 사용하지 않습니다
send-keys
. 일반적으로 말하면명령을 실행하는 데 사용하지 마십시오send-keys
.tmux 내에서 새로운 쉘을 생성하는 어떤(?) tmux 명령이라도 쉘 명령을 실행할 수 있습니다. 이는 예제 스크립트의echo "step 0"; bash
쉘 명령입니다 . 실제 command()가 완료될 때 창이 종료되지 않도록bash
끝에 포함되어 있습니다 .echo
대안은remain-on-exit
선택하는 것입니다. 쉘 명령(watch
)은 무한정 작동하므로 그러한 트릭이 필요하지 않을 것입니다.send-keys
명령이 실행되는 셸에 영향을 미치고 목표가 이러한 방식으로 준비된 셸에서 대화형으로 작업하는 것이라면 스크립트에서와 같이 셸 명령을 실행하는 것이 합리적입니다. 예를 들어, 명령은 변수를 설정하거나 스크립트를 가져오거나watch
이를 중단하고 셸 기록에 저장할 수 있습니다 . 다른 경우에 "올바른" 방법은 tmux 또는 유사한 명령을 사용하여split-window
명령을 전달하는 것입니다respawn-pane
.
추가 정보:
cat /proc/cpuinfo | grep "MHz" | …
쓸모없는 사용입니다cat
. 더 좋은 방법:</proc/cpuinfo grep "MHz" | … grep "MHz" /proc/cpuinfo | …
답변2
왼쪽을 먼저 만든 다음 오른쪽을 만들고 창을 원하는 비율로 매번 분할합니다.
tmux new -d
tmux splitw -dh
tmux splitw -p90
tmux splitw -dp22 # 20/90
tmux splitw -h
tmux selectp -t'{right}'
tmux splitw -p80
tmux splitw -p56 # (15+15+15)/80
tmux splitw -p50
tmux selectp -t'{top-left}'
tmux a
분할 창을 한 번에 하나씩 추가하고 결과를 확인하여 현재 창이 어떤 창인지, 다음 창을 어떻게 분할해야 하는지 확인합니다.