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


191

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

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

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

추가 관찰 :

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


각 세션에서, 각각의 창에서 각 창에 적용되는 솔루션을 찾는 희망이 질문에 오는 사람들을 위해 scripter.co/command-to-every-pane-window-session-in-tmux
CHB

답변:


355

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

Ctrl-B :

setw synchronize-panes on

clear history

53
완벽을 기하기 위해, 만약 당신이한다면 끄십시오Ctrl-b :setw synchronize-panes off
Mitch

19
당신은에 이것에 대한 바로 가기를 바인딩 할 수 있습니다 ~/.tmux.conf: 추가 bind -n C-x setw synchronize-panes on bind -n M-x setw synchronize-panes off
guneysus

4
토글에 대해 동일한 셔컷을 설정할 수 있습니까?
Arnold Roa

20
@ArnoldRoa 예, 떠나면 옵션이 토글됩니다 on/off. 그래서bind -n C-x setw synchronize-panes
센세이션

1
bind -n C-x setw synchronize-panes어떤 단축키를 추가하면을 눌러 호출해야합니까? 접두사 + C & x입니까? 나는 많은 옵션을 시도했다
Bill Goldberg

29

파티에 조금 늦었지만 하나의 명령을 보내기 위해 동기화 창을 설정하고 설정 해제하고 싶지 않았으므로 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의 별칭입니다.


TMUX 명령 프롬프트에서 같은이 bash는하지만, 사람이 할 수있는, 내가 일을 의미하는prefix + :
의 Rho 피

그 방법이 가능한지 모르겠습니다. 를 통해 명령을 보내야하는 사용 사례 시나리오는 무엇입니까 <prefix>:?
kshenoy

bash snippet ( : run "yourscript.sh yourargs...")을 호출하는 것이 좋습니다 . 명령이 활성 또는 지정된 창을 출력 한 경우 q를 누를 때까지 결과가 표시되지만이 경우에는 그렇지 않습니다. 물론 이것을 원하는대로 별칭 / 바인딩 할 수 있습니다. 또한 내부 프로세스는 키 입력이나 그 효과를 다르게 해석 할 수 있으므로 화이트리스트 또는 블랙리스트 #{pane_current_cmd}가 필요할 수 있습니다. 나는 ctrl + k와 역사를 보내려고 ctrl + k를 가지고있다. 이것은 쉘에서는 잘 작동하지만 Vim의 버퍼는 클로버입니다. ctrl + k를 브로드 캐스트하려면 수정이 필요합니다.
John P

이것은 XY 문제 일 수 있습니다. Tmux 명령 프롬프트는 유용하지만 다른 명령 프롬프트가 열려 있지 않으므로 사용중인 것 같습니다. 원하는 경우 접두사없이 키 바인딩을 설정하여 <prefix>:각 명령 전에 전송 하고 명령을 떠난 후 출력을 잃는 대신 선택한 쉘로 추가 창을 토글하고 초점을 맞출 수 있습니다. Tmux를 통해 실행됩니다. 예를 들어, <prefix>:run "man cat"남자가 현재 남자 호출기에 나타나 pidof man거나 심지어 ps auxf | grep man'낮음'으로 나타나지 않습니다.
John P

링크가 죽었다
Mateusz Piotrowski

10

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로 다시 바꿨습니다).


4

위의 답변 중 어느 것도 나를 위해 효과가 없었지만 (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"를 보내는 것은 효과가 없었습니다.

3

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

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

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

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


이 외계 언어에 대해 뭔가 말을하고 싶은
무하마드 오메르 빈 라덴

뭐? 영어는 어렵지 않습니다. 그러나 할 말이 있다면 말하십시오.
RJ

4
:D친구는 텍스트가 매우 적기 때문에 답변에 설명을 추가해야하며 그 이유로 Stackoverflow는 스팸 또는 저품질 게시물로 감지하여 세부 정보를 추가하여 그 아래에 표시되지 않도록합니다.
무하마드 오메르 이슬람

6
재밌습니다. 받아 들여진 대답에는 설명이없고 코드 만 있지만 아무것도 아닙니다.
RJ

0

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

#!/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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.