현재 창에서 트리 모드가 아닌 모든 창을 다시 생성할 수 있기를 원합니다. 이 스크립트를 만들었고 작동합니다.
for i in $(tmux list-panes -F "#{line} #{pane_id} #{pane_mode} #{pane_active}" | sort -k3 | grep -v tree-mode | awk '{print$2}'); do tmux respawn-pane -k -t $i; done
R
tmux-action+ 키 에 바인딩하고 싶습니다 . 그러나 이것은 작동하지 않습니다.
나는 다음을 시도했다:
bind-key R send-keys "for i in $(tmux list-panes -F "#{line} #{pane_id} #{pane_mode} #{pane_active}" | sort -k3 | grep -v tree-mode | awk '{print$2}'); do tmux respawn-pane -k -t $i; done"
bind-key R run-shell "for i in $(tmux list-panes -F "#{line} #{pane_id} #{pane_mode} #{pane_active}" | sort -k3 | grep -v tree-mode | awk '{print$2}'); do tmux respawn-pane -k -t $i; done" Enter
또한 스크립트를 파일에 넣고 다음을 추가해 보았습니다..tmux.conf
bind-key R run-shell "./tmux_respawn.sh"
그런데 127 오류가 발생하는데 이유를 모르겠습니다. 현재 창에서 스크립트를 실행하면 오류가 발생하지 않고 작동합니다.
또한 ~/.bashrc에 별칭을 구축하려고 시도했는데 셸에서는 잘 작동하지만 키 바인드를 통해 실행하려고 하면 셸 127 오류가 발생합니다.
alias RespawnTmuxPanes='for i in $(/usr/local/bin/tmux list-panes -F "#{line} #{pane_id} #{pane_mode} #{pane_active}" | sort -k3 | grep -v tree-mode | awk '{print$2}'); do /usr/local/bin/tmux respawn-pane -k -t $i; done'
이 스크립트에 대해 별도의 파일을 만들고 싶지 않고 .tmux.conf
바인딩 키를 사용하여 직접 실행하고 싶습니다. 어떻게 해야 합니까?
답변1
나는 스크립트를 직접 실행하려는 시도를 포기하고 ~/.tmux.conf
tmux가 실행할 별도의 파일에 스크립트를 구축했습니다.
스크립트:
#!/bin/bash
for i in $(tmux list-panes -F '#{pane_id} #{pane_mode} #{pane_active}' -f '#{?#{m:tree-mode,#{pane_mode}},0,1}' | sort -k2 | cut -f1 -d' '); do tmux respawn-pane -k -t $i; done
-f
참고: tmux를 사용하여 트리 모드 창을 필터링하는 방법을 찾았으므로 awk
.
이것은 내 tmux 파일의 항목입니다.
bind-key R run-shell "/home/mradmin/.tmux_respawn_screens.sh"
이제 TMUX-ACTION+를 수행할 수 R
있고 트리 모드에 있지 않은 모든 창을 다시 생성하고 마지막에 있었던 활성 창을 실행하기 때문에 이것이 작동합니다.
답변2
/home/user/libexec/tmux-foo
이는 외부 스크립트를 호출하여 수행하는 것이 가장 좋습니다 (예: 정규화된 경로 사용 ). 그렇지 않으면 보간 및 인용 규칙의 계층적 중첩을 tmux
처리 해야 합니다. 기쁨!sh
awk
더욱이 명령이 너무 복잡합니다. 특히 명령이 여러 가지 방법으로 깨졌다는 점, 특히 내부 항목을 "
모두 이스케이프 처리해야 \"
하고 보간으로부터 보호하기 위해 내부 항목 중 일부 도 이스케이프 $variables
해야 할 수도 있다는 점을 고려하면 더욱 그렇습니다.\$variable
tmux
tmux
따라서 우리는 간단한 것이 필요하고 구성을 다시 로드하여 새 구성을 가져오고 tmux
오타가 많이 발생하기 때문에 비명을 지르지 않는지 확인하는 방법이 필요합니다. 나보다)). 또한 이미 R
다시 로드할 수 있는 기능이 있으므로 위에 특수 명령을 넣었는데 W
이를 변경하고 싶을 수도 있습니다.
bind-key R source-file ~/.tmux.conf \; display-message "source-file done"
bind-key W run-shell "tmux list-panes -F \"#{pane_id} #{pane_mode}\" >> SOMEOUTPUTFROMTMUX"
이를 통해 R
W
구문 오류가 tmux
보고되지 않았는지 실행하고 확인한 다음 SOMEOUTPUTFROMTMUX
홈 디렉터리에 있는 파일을 찾을 수 있습니다. 그렇지 않으면 쉽게 찾을 수 있습니다. 다른 터미널에서는 tmux
구성을 수정하는 동안 파일을 볼 수 있습니다.
tail -f SOMEOUTPUTFROMTMUX
또한 명령을 어떻게 실행했는지에 따라 tmux
명령이 #{line}
존재하거나 존재하지 않도록 단순화했으며 tmux
, 이동된 열로 인해 올바른 열을 선택하기가 약간 awk
어려워졌습니다. 또한 명령을 단축하고 CPU 시간을 절약하는 grep ... | awk ...
더 복잡한 표현식으로 단순화할 수도 있습니다 .awk ...
bind-key W run-shell "tmux list-panes -F \"#{pane_id} #{pane_mode}\" | awk '!/tree-mode/{print $1}' >> SOMEOUTPUTFROMTMUX"
R
W
자주 tmux
테스트해 보세요. 한꺼번에 다 하려고 하면 복잡해요. 각각의 새로운 쉘 명령을 테스트한 후 올바른 방향으로 가고 있는지 여부를 알 수 있습니다. 위의
tree-mode
사항은 제외됩니다.
bind-key W run-shell "tmux list-panes -F \"#{pane_id} #{pane_mode}\" | awk '!/tree-mode/{print $1}' | while read id; do echo $id >> SOMEOUTPUTFROMTMUX; done"
이런, 출력 파일이 비어 있습니다. tmux
분명히 인용되지 않은 내용에 대해 일부 처리가 수행되었으므로 $id
다음을 사용합니다.\$id
bind-key W run-shell "tmux list-panes -F \"#{pane_id} #{pane_mode}\" | awk '!/tree-mode/{print $1}' | while read id; do echo \$id >> SOMEOUTPUTFROMTMUX; done"
그러나 \$id
POSIX 쉘이 이상한 일을 하는 것을 방지하기 위해 이를 따옴표로 묶어야 합니다. 그렇지 않으면 실제로 삽입하려면 쉘이 필요하기 때문에 작은따옴표로 묶어서는 안 됩니다.
bind-key W run-shell "tmux list-panes -F \"#{pane_id} #{pane_mode}\" | awk '!/tree-mode/{print $1}' | while read id; do echo \"\$id\" >> SOMEOUTPUTFROMTMUX; done"
tmux
어쨌든, 이 접근 방식을 따르면 다른 변수를 다시 추가한 다음 명령이 작동하도록 할 수
sort
있고 결과가 좋아진 후에만 echo
원시인 디버깅(출력을 파일로 인쇄)을 실제 명령 tmux
실행으로 대체할 수 있습니다.
... while read id; do tmux respawn-pane -k -t \"\$id\"; done
또는 테스트하기 쉽고 tmux
보간 sh
및
awk
이스케이프 규칙을 위반하지 않는 파일을 제공하는 외부 스크립트에서 이 작업을 수행할 수 있습니다.