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...&

そしてそれはユニークでもコピーもされませbashdash

ベストアンサー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非対話型シェルで実行すると制御端末から完全に独立しておらず、端末プロセスが終了したときに終了することです。

おすすめ記事