설명된 문제를 조사하는 동안스택오버플로우에 대한 질문나는 이것을 비대화형 모드에서 bash가 종료하기 전에 X 시스템 클립보드를 지우는 것 같다는 것을 보여주는 테스트 사례로 축소했습니다. 테스트에서는 gnome 터미널을 열고 xclip
X 시스템 클립보드에 일부 텍스트를 저장(전달)하는 bash 스크립트를 실행합니다. 터미널이 열려 있을 때 클립보드를 쿼리하면 bash가 대화형 또는 비대화형 모드에서 실행 중인지 여부에 관계없이 거기에 있는 텍스트가 반환됩니다. 그러나 터미널을 닫은 후 bash가 대화형 모드에서 실행되면 클립보드 내용이 유지되지만 bash가 비대화형 모드에서 실행되면 손실됩니다.
$ cat xclip_test
#!/usr/bin/env bash
set -x
gnome-terminal -x bash -i -c "echo abc|xclip -selection clipboard; sleep 3"
sleep 1
xclip -o -selection clipboard
sleep 4
xclip -o -selection clipboard
gnome-terminal -x bash -c "echo 123|xclip -selection clipboard; sleep 3"
sleep 1
xclip -o -selection clipboard
sleep 4
xclip -o -selection clipboard
$ ./xclip_test
+ gnome-terminal -x bash -i -c 'echo abc|xclip -selection clipboard; sleep 3'
+ sleep 1
+ xclip -o -selection clipboard
abc
+ sleep 4
+ xclip -o -selection clipboard
abc
+ gnome-terminal -x bash -c 'echo 123|xclip -selection clipboard; sleep 3'
+ sleep 1
+ xclip -o -selection clipboard
123
+ sleep 4
+ xclip -o -selection clipboard
Error: target STRING not available #!!!!!!!!!!!!!
version 4.3.46(1)-release (x86_64-pc-linux-gnu)
저는 bash rc 파일을 사용자 정의하지 않고 기본 GNU bash( )를 사용하여 Ubuntu 16.04를 사용하고 있습니다 . .bash_logout
혹시라도 확인해 보니 clear_console
유틸리티에 전화가 왔습니다. 그러나 clear_console
클립보드는 처리되지 않는 것으로 보입니다. 게다가 이 예제에서는 bash를 로그인 셸로 실행하지 않습니다.
이에 대한 합리적인 설명이 있습니까?
편집하다
gnome-terminal
다음으로 교체해도 문제가 지속됩니다 xterm
.
gnome-terminal -x
... --> xterm -e
...&
그리고 그것은 고유하지도 않고 bash
복사되기도 합니다 dash
.
답변1
책의 저자원래 질문 스택오버플로우에서이는 xclip의 문제인 것으로 확인되었습니다.. 사용xsel
바꾸다xclip
X 클립보드를 사용하여 xclip
조작xsel
장소 데이터언제가 아니라 클립보드에다음에서 읽기클립보드):
$ cat xclip_test
#!/usr/bin/env bash
set -x
xterm -e bash -c "echo abc|xclip -selection clipboard; sleep 3"&
sleep 1
xclip -o -selection clipboard
sleep 4
xclip -o -selection clipboard
$ cat xsel_test
#!/usr/bin/env bash
set -x
xterm -e bash -c "echo abc|xsel --input --clipboard; sleep 3"&
sleep 1
xclip -o -selection clipboard
sleep 4
xclip -o -selection clipboard
$ diff xclip_test xsel_test
3c3
< xterm -e bash -c "echo abc|xclip -selection clipboard; sleep 3"&
---
> xterm -e bash -c "echo abc|xsel --input --clipboard; sleep 3"&
$ ./xclip_test
+ sleep 1
+ xterm -e bash -c 'echo abc|xclip -selection clipboard; sleep 3'
+ xclip -o -selection clipboard
abc
+ sleep 4
+ xclip -o -selection clipboard
Error: target STRING not available # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$ ./xsel_test
+ sleep 1
+ xterm -e bash -c 'echo abc|xsel --input --clipboard; sleep 3'
+ xclip -o -selection clipboard
abc
+ sleep 4
+ xclip -o -selection clipboard
abc
xclip
두 가지 모두 xsel
터미널에서 분리하고 요청 시 선택 사항을 제공하는 하위 프로세스를 생성하여 작동합니다(새 선택이 이루어질 때까지).
$ ps -H
PID TTY TIME CMD
24307 pts/12 00:00:01 bash
27476 pts/12 00:00:00 ps
$ echo qwerty|xclip -selection clipboard
$ ps -H
PID TTY TIME CMD
27481 pts/12 00:00:00 xclip <-- !!!!!!
24307 pts/12 00:00:01 bash
27482 pts/12 00:00:00 ps
문제는 xclip
비대화형 쉘에서 실행될 때 제어 터미널로부터 완전히 독립되지 않고 터미널 프로세스가 종료될 때 종료된다는 점인 것 같습니다.
답변2
실제로 X "시스템 클립보드"는 없습니다. 수신을 선택하세요.
따라서 첫 번째 클라이언트가 죽으면 옵션이 없습니다. 그러나 bash 대화형 모드가 "터미널/bash가 여전히 응답합니다"로 어떻게 변환되는지 잘 모르겠습니다. 하나를 만들면 ps
문제 해결에 도움이 될 수 있습니다.
클립보드 선택에도 동일하게 적용됩니다.~하지 않는 한xclipboard
이 프로그램(또는 유사한 프로그램)을 동시에 실행하면 프로그램이 선택 사항을 제공하는 책임을 맡습니다. (예를 들어위키피디아기사).
영구 콘텐츠를 저장하는 데 사용할 수 있는 루트 창 속성으로 저장된 클립 버퍼도 있습니다.
답변3
pass
나는 같은 문제에 직면했습니다 eshell
. 이 pass
프로그램은 을 사용하는데 xclip
, 당신이 언급한 것과 같은 방식으로 실패합니다.
xclip
내 해결책은 다음 내용을 사용하여 내 PATH에서 /usr/bin 앞에 이름이 지정된 래퍼 스크립트를 만드는 것이었습니다 .
#!/bin/sh
exec setsid /usr/bin/xclip "$@"
답변4
xclip -i를 사용하여 이와 유사한 문제가 발생했습니다. 스크립트는 다음으로 끝납니다.
echo $totp | xclip -i -r
이는 쉘 프롬프트에서는 잘 작동하지만 명령 대체에 스크립트를 사용하면
totp=$(get-totp)
xclip이 정지됩니다. 표준 출력을 끄면 문제가 해결됩니다.
echo $totp | xclip -i -r >&-