xclip은 대화형 쉘과 비대화형 쉘에서 다르게 작동합니다.

xclip은 대화형 쉘과 비대화형 쉘에서 다르게 작동합니다.

설명된 문제를 조사하는 동안스택오버플로우에 대한 질문나는 이것을 비대화형 모드에서 bash가 종료하기 전에 X 시스템 클립보드를 지우는 것 같다는 것을 보여주는 테스트 사례로 축소했습니다. 테스트에서는 gnome 터미널을 열고 xclipX 시스템 클립보드에 일부 텍스트를 저장(전달)하는 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바꾸다xclipX 클립보드를 사용하여 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 >&-

관련 정보