[tmux] tmux의 모든 창에 명령을 보내는 방법은 무엇입니까?

나는 :clear-history거대한 스크롤 백이있는 창 을 호출 하고 싶습니다 . 그러나이 명령을 다양한 창의 모든 창으로 보내는 방법을 스크립트하고 싶습니다.

질문 에 의거하여 모든 창에 명령을 보내는 방법을 알고 있지만 어떤 창의 모든 창에 명령을 보내려면 어떻게해야합니까?

send-keys그리고 synchronize-panestmux 맨 페이지에서 생각 나지만, 어떻게 결혼해야할지 모르겠습니다. 그러나이 작업을 수행하는 더 간단한 방법이있을 수 있습니다.

추가 관찰 :

이것에 대해 조금 생각 tmux list-panes -a하면 현재 세션의 모든 창을 나열하는 것 같습니다. 시작하는 데 매우 유용합니다. 여기서 어디로 가나 요?



답변

여러 개의 창이있는 tmux 창에서 다음을 시도 했습니까?

Ctrl-B :

setw synchronize-panes on

clear history


답변

파티에 조금 늦었지만 하나의 명령을 보내기 위해 동기화 창을 설정하고 설정 해제하고 싶지 않았으므로 tmux 주위에 래퍼 함수를 ​​만들고이라는 사용자 정의 함수를 추가했습니다 send-keys-all-panes.

_tmux_send_keys_all_panes_ () {
  for _pane in $(tmux list-panes -F '#P'); do
    tmux send-keys -t ${_pane} "$@"
  done
}

또한 tmux 명령 주위에 래퍼를 만들어이 함수를 편리하게 호출 할 수 있습니다. 래퍼와 위의 코드는 모두 여기에 있습니다 .

이를 통해 모든 창 으로 실행 tmux send-keys-all-panes <command>하거나 tmux skap <command보낼 <command>수 있습니다.

tmux는 래퍼 함수 tmux_pp의 별칭입니다.


답변

2019 년 6 월 업데이트

동기화 창에 대한 고유 바인딩을 구성하는 방법에 대한 간단한 그림 .

내에 다음을 추가했습니다 tmux.conf(주석은 전체 구성에 확실히 적용됩니다).

# synchronize all panes in a window
# don't use control S, too easily confused
# with navigation key sequences in tmux (show sessions)
unbind C-S
bind C-Y set-window-option synchronize-panes

이제 여러 창에서 명령을로 동기화하는 기능을 토글 할 수 있습니다 <C-a><C-y>.

(예, 바인드 키를 Ctrl a로 다시 바꿨습니다).


답변

위의 답변 중 어느 것도 나를 위해 효과가 없었지만 (tmux v2.3) bash 명령 줄에서 수행되었습니다.

for _pane in $(tmux list-panes -a -F '#{pane_id}'); do \
  tmux clear-history -t ${_pane}  ; done

‘clear-history’이외의 tmux 명령에 대해보다 일반화 된 스크립트는 해당 요소를 매개 변수로 대체합니다 (예 : $ 1. “-t $ {_ pane}”이 각각에 적용되어야하므로 일련의 tmux 명령을 처리하기위한 스크립트를 작성하려는 경우주의하십시오.

것을 참고 -a매개 변수가하는 tmux list-panes모든 세션에있는 모든 창에있는 모든 창을 충당하기 위해 필요합니다. 그렇지 않으면 현재 tmux 창의 페인 만 영향을받습니다. 하나 개 이상의 TMUX 세션이 열려 만 현재 세션 내에서 창에 명령을 적용 할 경우, 교체 -a-s(그것은 TMUX man 페이지에서 모든입니다).

위의 각 답변에 대해 직접 언급 할 수있는 mod 포인트가 없으므로 다음과 같이 작동하지 않습니다.

@ shailesh-garg의 대답에서 내가 가진 문제는 동기화가 창 Ctrl-B :외부에서 실행 되는 tmux 명령이 아니라 창 내에서 실행 된 명령에만 영향을 미친다는 것입니다 .

@kshenoy의 답변에 대한 세 가지 문제는 다음과 같습니다.

  1. 예를 들어, 창에서 bash 쉘이 실행 중이고 스크립트를 사용하여 “clear-history”를 보내는 경우 키 스트로크가 해당 창의 tmux 조작이 아닌 창 내로 키 스트로크를 보냅니다. bash 명령 줄에 나타납니다. 해결 방법은 “tmux clear-history”를 보내거나 “tmux”를 “$ @”앞에 추가하는 것이지만 대답에 대한 다른 문제로 인해 답변을 편집하지 않았습니다.
  2. 문자 그대로 줄을 바꾸지 않고 줄 바꿈 문자를 보내는 방법을 알 수 없었습니다.
  3. 내가 그렇게해도 “tmux clear-history”를 보내는 것은 효과가 없었습니다.

답변

내 tmux 버전은 1.9a이며 이것은 저에게 효과적입니다. 하나의 키로 충분합니다.

bind-key X set-window-option synchronize-panes\; display-message "synchronize-panes is now #{?pane_synchronized,on,off}"


답변

tmux send-keys -t <session id> <command> C-m

“세션 ID”와 “명령”을 적절히 교체하십시오.


답변

이것은 내 유틸리티 기능으로 창에 아무것도 실행되지 않을 때만 명령을 실행합니다.

#!/bin/bash

_send_bash_command_to_session() {
    if [[ $# -eq 0 || "$1" = "--help" ]] ; then
        echo 'Usage: _send_bash_command_to_session $session_name what ever command you want: '
        return
    fi
    input_session="$1"
    input_command="${@:2}"
    for _pane in $(tmux list-panes -s -t ${input_session} -F '#{window_index}.#{pane_index}'); do
        # only apply the command in bash or zsh panes.
        _current_command=$(tmux display-message -p -t ${input_session}:${_pane} '#{pane_current_command}')
        if [ ${_current_command} = zsh ] || [ ${_current_command} = bash ] ; then
            tmux send-keys -t ${_pane} "${input_command}" Enter
        fi
    done
}

tmux_set_venv() {
    _current_session=$(tmux display-message -p '#{session_name}')
    _send_bash_command_to_session ${_current_session} workon $1
}

dev라는 세션을 대상으로하는 예제 는 vim 또는 다른 실행 파일이있는 페인에서 명령을 실행하지 않고 bash또는에 있는 모든 페인에서 파이썬 virtualenv를 활성화합니다 zsh.

_send_bash_command_to_session dev workon myvirtualenv

또는 기억하기 쉬운 : 현재 세션에서 수행하십시오.

tmux_set_venv myvirtualenv

이 기능으로 구성 파일 을 찾으십시오 .