bash 명령에 대한 tmux 바인딩 키가 작동을 거부합니다.

bash 명령에 대한 tmux 바인딩 키가 작동을 거부합니다.

현재 창에서 트리 모드가 아닌 모든 창을 다시 생성할 수 있기를 원합니다. 이 스크립트를 만들었고 작동합니다.

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

Rtmux-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.conftmux가 실행할 별도의 파일에 스크립트를 구축했습니다.

스크립트:

#!/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처리 해야 합니다. 기쁨!shawk

더욱이 명령이 너무 복잡합니다. 특히 명령이 여러 가지 방법으로 깨졌다는 점, 특히 내부 항목을 "모두 이스케이프 처리해야 \"하고 보간으로부터 보호하기 위해 내부 항목 중 일부 도 이스케이프 $variables해야 할 수도 있다는 점을 고려하면 더욱 그렇습니다.\$variabletmux

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"

그러나 \$idPOSIX 쉘이 이상한 일을 하는 것을 방지하기 위해 이를 따옴표로 묶어야 합니다. 그렇지 않으면 실제로 삽입하려면 쉘이 필요하기 때문에 작은따옴표로 묶어서는 안 됩니다.

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보간 shawk이스케이프 규칙을 위반하지 않는 파일을 제공하는 외부 스크립트에서 이 작업을 수행할 수 있습니다.

관련 정보