쉘 파이프를 사용하여 tmux "클립보드"에서/로 복사하는 방법은 무엇입니까?

쉘 파이프를 사용하여 tmux "클립보드"에서/로 복사하는 방법은 무엇입니까?

셸 환경에서 작업할 때 "중간 파이프 출력"(예: 이미 실행 중인 편집기, 다른 셸, 다른 컴퓨터 등에서/으로)을 복사해야 하는 상황에 자주 직면합니다.

창 환경에서 이 문제를 해결하는 간단한(일반적인) 방법은 일반적으로 시스템 클립보드를 사용하는 것입니다. 예를 들면 다음과 같습니다.

  • X11: ... | xsel -i/xsel -o | ...
  • 운영 체제: ... | pbcopy/pbpaste | ...

tmux 복사/붙여넣기 도구를 사용하여 유사한 편리한 동작을 어떻게 얻을 수 있습니까?

답변1

너무 길어요.

  • ... | tmux loadb -
  • tmux saveb - | ...

설명 및 배경

tmux에서는 모든 복사/붙여넣기 활동이 진행됩니다.버퍼 스택여기서 맨 위(색인 0)는 가장 최근에 복사된 텍스트이며 버퍼 색인이 명시적으로 제공되지 않을 때 붙여넣는 데 사용됩니다 -b. tmux list-buffers기본 단축키인 tmux-prefix+를 사용하여 현재 버퍼를 확인할 수 있습니다 #.

스택 상단에 있는 새 tmux 버퍼로 파이프하는 방법에는 두 가지가 있습니다. set-buffer문자열 인수를 사용하는 것과 load-buffer파일 인수를 사용하는 것입니다. 버퍼로 파이프하려면 일반적 load-buffer으로 stdin을 사용하여 작업해야 합니다. 예를 들면 다음과 같습니다.

print -l **/* | tmux loadb -

편집기에 다시 붙여넣는 것은 매우 분명합니다( tmux-prefix+ ]또는 바인딩하는 모든 것 paste-buffer). 그러나 셸 내부에서 붙여넣기에 액세스하는 것은 그렇지 않습니다. 호출이 paste-buffer붙여넣기를 stdout에 기록하고 터미널의 편집 버퍼에 저장되기 때문입니다. 그리고 붙여넣기 내용에 새 줄을 입력하면 쉘이 지금까지 붙여넣은 내용을 실행하게 됩니다(잠재적으로 하루를 망칠 수 있는 좋은 방법입니다).

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

  1. tmux pasteb -s ' ': -s모든 줄 끝(구분 기호)을 사용자가 제공하는 구분 기호로 바꿉니다. 그러나 여전히 이 동작이 발생합니다. paste-buffer이는 붙여넣기가 터미널 편집 버퍼에서 끝나는 것을 의미합니다. 이는 원하는 것일 수도 있지만 일반적으로 그렇지 않습니다.
  2. tmux showb | ...: show-buffer버퍼를 stdout으로 인쇄합니다. 이는 거의 필요한 것이지만 다음과 같습니다.Chris Johnson이 댓글에서 언급함, show-buffer인쇄할 수 없는 ASCII 문자와 ASCII가 아닌 문자의 8진수 인코딩을 수행합니다. 불행하게도 이것은 null로 끝나는 문자열이나 악센트가 있는 라틴 문자(zsh's print -N á | tmux loadb - ; tmux showbprints 에서 \303\241\000) 와 같은 단순한 것에서도 종종 깨지고 귀찮습니다 .
  3. tmux saveb - | ...: save-buffer그 반대를 수행 load-buffer하고 수정되지 않은 원시 바이트를 표준 출력에 씁니다. 이는 대부분의 경우에 필요한 것입니다. 그런 다음 예를 들어 다른 파이프 조립을 진행할 수 있습니다. | xargs -n1 -I{} ...프로세스 방식 등으로 수행합니다 .

관련 정보