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

答え2

実際、X「システムクリップボード」はありません。受信を選択してください。

したがって、最初のクライアントが死んだ場合、オプションはありません。しかし、bashインタラクティブモードが「ターミナル/bashがまだ応答しています」にどのように変換されるのかわかりません。 1つを作成すると、トラブルシューティング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 >&-

関連情報