tmux는 키 바인딩을 사용하여 파이프/명령 체인을 실행합니다.

tmux는 키 바인딩을 사용하여 파이프/명령 체인을 실행합니다.

tmux를 사용하여 쉘에서와 같은 명령 체인을 어떻게 실행할 수 있나요? 성공 여부에 따라 여러 명령을 실행하고 싶습니다. 터미널(또는 명령 모음)에 에코아웃하고 싶습니다.

예를 들어 다음과 같이 구성을 다시 로드하는 키 바인딩이 있습니다. 그리고 reloaded그 일이 일어났음을 알리기 위해 출력하고 싶습니다 . 하지만 source-file트리거할 때 오류가 표시됩니다.

bind r source-file ~/.tmux.conf   # works fine
bind r source-file ~/.tmux.conf && echo reloaded.   # doesn't work shows source-file help in command bar.
bind r source-file ~/.tmux.conf; echo reloaded.  # doesn't work, says not recognized 'echo'

그리고 이 명령은 어떤 쉘에서 호출됩니까? 탭/창/창에서 실행되는 기본 쉘 또는 현재 쉘 또는 포그라운드 프로그램? 내 기본 쉘은 fish.

답변1

뒤에 지정하는 항목은 bind r하나 이상이어야 합니다.tmux 명령(인수 유무에 관계없이). source-file ~/.tmux.conf유효한 tmux 명령입니다. source-file ~/.tmux.conf && echo reloaded.아니다. 사용해야 하는 둘 이상의 tmux 명령을 실행하려면 ;(때로는 의 형식으로 \;, 다음을 참조하세요.)tmux 키를 여러 명령에 바인딩자세한 내용은). 그러나 echotmux 명령은 아닙니다.

그러나run-shell실행할 수 있는 tmux 명령임의의쉘의 코드. 내 테스트에 따르면 쉘은 sh(내 명령 해석기가 아닌 경우에도 sh)입니다. 매뉴얼에서는 다음을 확인합니다.

쉘 명령인수는 sh(1)명령입니다.

source-file쉘에서 실행하려면 를 호출해야 합니다 tmux source-file …. 다음 줄이 .tmux.conf작동해야 합니다.

bind-key r run-shell 'tmux source-file ~/.tmux.conf && echo reloaded'

셸의 출력(예: echo이 경우 출력)은 보기 모드에 표시됩니다. 개인적으로 나는 짧은 메시지가 상태 표시줄에 표시되기를 원하므로 다음 변형을 사용하는 것이 좋습니다.

bind-key r run-shell 'tmux source-file ~/.tmux.conf && tmux display-message reloaded'

이 바인딩을 트리거할 때 어떤 일이 발생하는지 분석하는 것은 매우 교육적입니다. 당신은 tmux 서버와 통신하는 tmux 클라이언트에 있습니다. 클라이언트가 적절한 키 시퀀스인 를 수신하면 prefixr서버에 알리고 서버는 바인딩에 따라 작동합니다. 클라이언트는 셸을 실행합니다. 쉘은 동일한 tmux 서버와 통신하고 명령을 실행하는 또 다른 tmux 클라이언트를 실행합니다 source-file …. 그런 다음 쉘은 서버와 통신하고 실행하라고 지시하는 또 다른 tmux 클라이언트를 실행합니다 display-message ….

즉, 서버는 동일한 서버에 작업을 지시하는 클라이언트를 생성하는 일부 코드를 실행합니다.

원래 작업 바인딩( bind r source-file ~/.tmux.conf)은 훨씬 간단하며 서버가 source-file …직접 실행됩니다.

source-file및 는 tmux 명령 이므로 display-message쉘을 생성하지 않고도 키 입력으로 두 명령을 모두 실행할 수 있습니다.

bind-key r source-file ~/.tmux.conf \; display-message reloaded

\;여기서는 쉘처럼 작동할 것으로 예상할 수 있지만 ;실제로는 &&. 매뉴얼:

각 명령은 개행 또는 세미콜론( ;)으로 종료됩니다. 세미콜론으로 구분된 명령은 함께 모여서명령 순서- 시퀀스의 명령에 오류가 발생하면 후속 명령이 실행되지 않습니다.

따라서 이 마지막 바인딩은 귀하의 경우에 딱 맞는 것 같습니다. 불필요한 쉘을 생성하지 않습니다. 그래도 run-shell추가 tmux 클라이언트를 통해 무엇이든 실행할 수 있다는 것을 아는 것이 좋습니다 .

두 가지 접근 방식을 혼합할 수 있습니다.

bind-key r source-file ~/.tmux.conf \; run-shell '#some complex logic here or whatever'

그리고 거기에if-shell. 예:

bind-key r if-shell 'tmux source-file ~/.tmux.conf' 'display-message reloaded' 'display-message "reload failed"'

관련 정보