記載されている問題の調査中スタックオーバーフローに関する質問私はこれを非対話モードで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がまだ応答しています」にどのように変換されるのかわかりません。 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 >&-