셸 환경에서 작업할 때 "중간 파이프 출력"(예: 이미 실행 중인 편집기, 다른 셸, 다른 컴퓨터 등에서/으로)을 복사해야 하는 상황에 자주 직면합니다.
창 환경에서 이 문제를 해결하는 간단한(일반적인) 방법은 일반적으로 시스템 클립보드를 사용하는 것입니다. 예를 들면 다음과 같습니다.
- 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에 기록하고 터미널의 편집 버퍼에 저장되기 때문입니다. 그리고 붙여넣기 내용에 새 줄을 입력하면 쉘이 지금까지 붙여넣은 내용을 실행하게 됩니다(잠재적으로 하루를 망칠 수 있는 좋은 방법입니다).
이 문제를 해결하는 방법에는 여러 가지가 있습니다.
tmux pasteb -s ' '
:-s
모든 줄 끝(구분 기호)을 사용자가 제공하는 구분 기호로 바꿉니다. 그러나 여전히 이 동작이 발생합니다.paste-buffer
이는 붙여넣기가 터미널 편집 버퍼에서 끝나는 것을 의미합니다. 이는 원하는 것일 수도 있지만 일반적으로 그렇지 않습니다.tmux showb | ...
:show-buffer
버퍼를 stdout으로 인쇄합니다. 이는 거의 필요한 것이지만 다음과 같습니다.Chris Johnson이 댓글에서 언급함,show-buffer
인쇄할 수 없는 ASCII 문자와 ASCII가 아닌 문자의 8진수 인코딩을 수행합니다. 불행하게도 이것은 null로 끝나는 문자열이나 악센트가 있는 라틴 문자(zsh'sprint -N á | tmux loadb - ; tmux showb
prints 에서\303\241\000
) 와 같은 단순한 것에서도 종종 깨지고 귀찮습니다 .tmux saveb - | ...
:save-buffer
그 반대를 수행load-buffer
하고 수정되지 않은 원시 바이트를 표준 출력에 씁니다. 이는 대부분의 경우에 필요한 것입니다. 그런 다음 예를 들어 다른 파이프 조립을 진행할 수 있습니다.| xargs -n1 -I{} ...
프로세스 방식 등으로 수행합니다 .