Tmux run-shell xclip이 작동하지 않습니다.

Tmux run-shell xclip이 작동하지 않습니다.

저는 tmux 2.3을 사용하고 있으며 시스템 클립보드에 붙여넣기 버퍼를 보내는 명령을 정의하고 싶습니다. 아래 명령과 제가 생각할 수 있는 모든 변형을 사용해 보았지만 실행하려고 하면 종료 코드 1을 반환했다는 메시지가 나타납니다. sh에서 명령을 실행할 때 제대로 작동하고 xclip 부분을 제거해도 오류가 발생하지 않습니다. 오류의 원인을 어떻게 디버깅할 수 있나요? 나는 올바른 명령을 가지고 있다고 믿습니다.

bind-key b run-shell "tmux show-buffer | xclip -sel clip -i > /dev/null"

답변1

참고: 원래 질문에서는 tmux버전 2.3을 언급했는데, 이 모든 내용이 해당 버전과 3.2a에 적용된다는 것을 확인했습니다.

나에게 있어서 이것은 일반적으로 tmux환경 변수를 설정하지 않고 세션을 시작함으로써 발생하는데 DISPLAY, 이는 xclipX 서버와 통신하는 방법을 모른다는 것을 의미합니다.이 AskUbuntu 답변은 SSH에 더 중점을 두고 있지만 유용한 단락이 포함되어 있습니다.:

X11 전달이 활성화되었는지 확인하려면 DISPLAY 환경 변수 값을 확인하세요 echo $DISPLAY. localhost:10[...]와 유사한 값이 표시됩니다 . DISPLAY설정하지 않으면 수동으로 설정하는 것은 쓸모가 없습니다 [... ]

SSH가 아닌 로컬 세션에서는 다음과 같습니다 tmux.

$ echo "${DISPLAY:?}"
:0

다음과 같은 결과가 나오면 DISPLAY변수가 설정되지 않은 것입니다.

$ echo "${DISPLAY:?}"
sh: 1: DISPLAY: parameter null or not set

X 서버 세션 내에서 세션을 시작하는 방법을 파악하는 것이 가장 좋지만 tmuxX 서버 세션 내에서 터미널을 시작할 수 있다면 DISPLAY변수가 무엇인지 알아보고 세션에서 임시로 설정하여 tmux확인하는 것이 유용할 수 있습니다. 공장:

export DISPLAY=':0'

Ubuntu Community Wiki에는 쉘 변수에 대한 짧지만 자세한 소개가 있습니다.(이 언급되어 있지만 대부분 bash의 정보는 POSIX_compile과 호환되지 않는 csh, tcsh및 를 제외하고 대부분의 쉘에 적용됩니다.) 이 구문은 POSIX 셸 프로그래밍 언어의 일부이며 다른 언어 경험이 있는 사람에게도 매우 직관에 어긋난다는 점에 유의하세요.fishDISPLAYexport VARIABLE_NAME=value이 Stack Exchange 질문에는 환경 변수를 설정하는 방법에 대한 자세한 설명이 있습니다.

일반적으로 터미널 응용 프로그램을 시작한 다음 터미널의 쉘을 사용하여 명령줄 프로그램을 실행하여 X 서버 세션에서 명령줄 프로그램을 시작할 수 있습니다.

GNOME에서는 다음과 같습니다:

  1. 귀하의 계정에 로그인하십시오
  2. 터미널 시작
  3. tmux new-session터미널에서 명령으로 실행(경우에 따라 이미 실행 중인 세션에 연결되는 경우도 있음)

일단 시작되면 tmux쉘은 DISPLAY환경 변수가 설정된 상태로 시작되고 xclip작동합니다.

$ xclip -verbose -out
Connecting to X server.
Using UTF8_STRING.

다른 내용이 표시될 수 있으며, 클립보드에 이미 내용이 포함되어 있으면 해당 내용이 터미널에 표시됩니다. 실행하기 전에 일부 텍스트를 복사하거나 강조 표시하거나 선택해 보세요.

대신 다음과 같이 표시됩니다.

xclip: command not found

xclip이는 설치되지 않았거나 찾을 수 없음을 의미합니다 .

작동하는 경우 xclip명령을 키 바인딩으로 설정해 볼 수 있습니다 tmux(이 실행은 이미 세션 내에 있을 때만 작동할 수 있음 tmux ).

tmux bind-key -T prefix b run-shell "tmux show-buffer | xclip -se c -i > /dev/null"

Run은 tmux list-keys | less기본 키 바인딩과 구성 파일에서 이를 설정하는 구문을 보여줍니다.

prefix테이블 에 키 바인딩을 명시적으로 추가했습니다 . tmux표의 명령(또는 키보드 단축키)은 기본적으로 + 또는 구문의 Cb prefix인 선행 키 시퀀스를 먼저 눌러 실행됩니다 . Ctrl+를 누른 다음(Cb b) 명령을 실행해야 합니다. 접두사 키 조합을 눌러야 함을 나타내는 데 사용하겠습니다.btmuxCtrlbbprefix

오류가 발생했습니다. tmux콘텐츠 복사 모드를 켭니다 'tmux show-buffer | xclip -se c -i > /dev/null' returned 1.

실행하는 명령이 run-shellstdout에 출력을 인쇄하는 경우 tmux현재 창에서 복사 모드를 켜고 해당 출력을 표시합니다. 쉘 명령이 실패하면 반환 또는 종료 코드를 설명하는 줄도 표시됩니다. prefix그러면 기본적으로 q복사 모드가 종료됩니다 .

tmux많은 프로그램은 's 를 포함하여 stdout이 아닌 stderr에 오류를 인쇄하므로 show-buffer오류 정보가 손실됩니다. 이를 잡기 위해 쉘 파이프를 버리고 쉘 리디렉션을 변경할 수 있습니다.

$ tmux show-buffer
no buffers

$ echo $?  # prints 1 if the previous command failed
1

$ tmux run-shell "tmux show-buffer"
'tmux show-buffer' returned 1

$ tmux run-shell "tmux show-buffer 2>&1"
no buffers
'tmux show-buffer 2>&1' returned 1

tmux시작 시 기본적으로 버퍼가 없기 때문에 이 오류 메시지가 반환됩니다 .

버퍼가 있는 경우 다음 명령은 이러한 버퍼와 해당 내용을 표시합니다(기본적으로 prefixthen 에 바인딩됨 =).

tmux choose-buffer

버퍼가 없으면 이 명령은 출력 없이 즉시 반환됩니다. 버퍼가 있는 경우 choose-buffer마지막 사용 시간을 기준으로 정렬된 모든 버퍼 목록을 표시합니다. 를 누르면 목록이 스크롤되고, 를 누르면 선택한 버퍼의 내용이 현재 창에 붙여넣어지고 종료됩니다.Enterq

버퍼를 생성하려면 다음 set-buffer명령을 사용하십시오.

$ tmux set-buffer "test content"
$ tmux save-buffer - && echo
test content

참고: && echo버퍼의 내용이 개행 문자로 끝나지 않기 때문에 필요합니다.

하나 이상의 버퍼에 대해 이 show-buffer명령은 가장 최근에 설정된 버퍼의 내용을 사용하여 복사 모드를 켭니다.

위의 셸 세션에서 save-buffer명령은 가장 최근에 설정된 버퍼의 내용을 파일에 인쇄하거나 -파일 이름이 제공된 경우 stdout에 인쇄합니다.

원래 구성은 다음과 같아야 합니다.*:

bind-key b run-shell "tmux save-buffer - | xclip -sel clip -i"

*tmux시스템 클립보드에 무언가를 복사하려고 하는 것 같습니다 .

일반적으로 tmux먼저 복사 모드로 들어가서 텍스트를 선택합니다. 기본적으로 이는 prefixthen 에 바인딩됩니다 [. tmux복사 모드에서 Emacs 스타일 키 바인딩을 사용하는 기본 구성을 사용하십시오 . 버전 2.3 에서는 tmux 이러한 키 바인딩을 표시에 사용할 수 있습니다 tmux list-keys -temacs-copy. 버전 2.3 이상에서 이 list-keys명령은 기본적으로 모든 테이블의 키 바인딩을 표시합니다.

참고: vi-style 키 바인딩은 또는 대신에 emacs-copy대체 하여 모든 명령 및 구성에서 사용할 수 있습니다.vi-copycopy-mode-vicopy-mode

선택한 텍스트를 시스템 클립보드 및 버퍼에 복사할 수 있습니다 tmux . 버전 2.3 에서는 tmux다음과 같은 방법으로 이를 달성할 수 있습니다.

bind-key -temacs-copy M-w copy-pipe "xclip -selection clipboard -in"

선택한 텍스트를 버퍼에 복사하는 것 외에도 Alt선택한 텍스트를 파이프하는 복사 모드의 + 기본 동작을 재정의합니다.wxcliptmux

버전 2.3 이상에서 동등한 구성은 다음과 같습니다.

bind-key -T copy-mode M-w send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -in"

두 버전 모두에서 다음은 X 서버 클립보드의 내용으로 버퍼를 생성한 다음 최신 버퍼를 붙여 넣어 prefix기본 동작을 대체합니다.]tmux

bind-key -T prefix ']' run-shell 'tmux set-buffer "$(xclip -selection clipboard -out)"' \; paste-buffer

알아채다xclip이렇게 사용하면 어떤 상황에서는 이상하게 동작할 수 있습니다.

버전 2.3은 2016년에 출시되었으며,따라서 대부분의 패키지 저장소에는 최신 버전이 있어야 합니다.

어느 쪽이든 사용하는 것이 좋습니다.tmux-yank, 복제 작업을 잘 관리하기 때문입니다 tmux.


잘못된 구성의 원인을 디버깅하는 경우 tmux일반적으로 이를 더 쉽게 만들기 위해 수행할 수 있는 몇 가지 작업이 있습니다.

  • 세션 내 터미널에서 명령 실행 tmux(가능한 경우)
  • 임시 구성 파일 생성
  • 메시지를 더 길게 표시

세션 내 터미널에서 명령 실행 tmux(가능한 경우)

tmux구성 파일에 배치할 수 있는 대부분의 명령은 단순히 명령줄 앞에 를 붙여서 세션 내에서 실행할 수도 있습니다 . 대부분의 쉘은 특정 문자를 구체적으로 해석 하므로 명령 문자를 순서대로 실행할 때 이러한 문자를 인용하는 데 주의하세요 tmux. 위에 제공된 모든 명령은 수정 없이 구성 파일에 접두사가 붙으면 작동합니다 .[ ] ; & " 'tmuxtmuxtmux

예를 들어 복사 모드에서 셸 세션을 사용할 수 없는 경우 이러한 명령을 실행하지 못할 수도 있습니다.

가능하다면 이는 명령의 각 부분에서 정확히 무슨 일이 일어나고 있는지 진단하는 데 도움이 될 수 있습니다.

tmux경우에 따라 명령 프롬프트에서 명령을 실행할 수 있습니다( prefix기본값 :). 구성 파일과 마찬가지로 명령을 입력하고 Enter실행을 누릅니다.

예를 들어, 복사 모드에서 를 누른 다음 상태 표시줄을 내용과 커서가 있는 노란색으로 prefix변경합니다 . 이와 같은 명령을 입력한 후 키를 누르면 상태 표시줄의 내용이 로 설정됩니다 . 종료하려면 터미널의 Break 키 조합을 누르십시오(대부분의 터미널에서 기본값은 + 이며 비슷한 내용이 나타날 수 있습니다 ).::display-message testEntertestCtrlcstty -aintr = ^C

참고: 이러한 메시지가 상태 표시줄에 표시되는 시간을 늘리려면 "메시지 표시 기간 연장" 섹션을 참조하세요.

참고: tmux2.4 이상에서는 명령 프롬프트에서 복사 모드 명령을 실행할 수 있습니다 send-keys -X begin-selection. 예를 들어 2.4 이전 버전에서는 이 작업을 수행하는 방법을 모르겠습니다.

임시 구성 파일 생성

디버깅을 돕기 위해 다음 이름의 파일에 잠재적인 구성 변경 사항을 추가할 수 있습니다 tmux_debug.conf.

# -q: do not return an error if the file doesn't exist
source-file -q /etc/tmux.conf
source-file -q ~/.tmux.conf

# add any experimental configuration below here

그리고 다음을 실행하세요 tmux:

tmux -f ./tmux_debug.conf

시작 되면 tmux기본적으로 두 개의 구성 파일을 읽습니다: /etc/tmux.conf~/.tmux.conf. 이 -f옵션은 이를 무시하고 사용자 정의 파일을 로드하도록 지시합니다. 우리는 이 두 가지 구성에 의존할 수 있으므로 존재하는 경우 구성을 얻습니다. 이렇게 하면 영구적인 변경 없이 현재 구성을 유지할 수 있습니다.

임시 구성 파일을 빠르게 다시 로드하기 위해 키 바인딩을 추가할 수도 있습니다.

bind-key -T prefix C-r source-file ./tmux_debug.conf \; display-message "sourced configuration"

prefix이렇게 하면 키 시퀀스가 ​​설정되고 Ctrl+가 시작 디렉토리 의 파일을 r다시 로드한 다음 상태 표시줄 에 텍스트가 표시됩니다.tmuxtmux_debug.conftmuxsourced configurationtmux

메시지를 더 길게 표시

이전 명령은 상태 표시줄에 메시지를 표시합니다. 기본적으로 tmux 메시지는 750밀리초 동안만 상태 표시줄에 표시되므로 실망스럽습니다.

구성 파일에 다음 줄을 추가하면 키를 누를 때까지 텍스트가 표시됩니다.

set -g display-time 0

참고: 키 입력은 방금 포커스를 얻은 창이나 창에서 실행 중인 항목으로 전송됩니다.

관련 정보