xselは、コマンドラインからシステムクリップボードにアクセスできるプログラムです。コピーした内容の末尾に改行文字がない場合は、クリップボードの内容の後に次のように警告が表示されます。
$ xsel -b
copied text
\ No newline at end of selection
以前は、この警告がstderrに印刷されると思いましたが、今日stderrがstdoutとマージされても警告がないことがわかりました。xsel-b |& less
警告なしにコピーされたテキストのみが印刷されます。なぜこれですか?
答え1
このコンテンツはxsel
まだ公開されていませんxsel
。この変化2008年に。
X 選択には、改行文字で終わらないテキストが含まれるのが一般的です。現状のままダンプすると、終了していない行が表示されます。bash
モニターなどの古いケースを使用すると、次のようになります。
bash-4.4$ xsel -b
xselbash-4.4$
(ここにクリップボードの選択項目が含まれていますxsel
)。最後に、次のプロンプトが選択に追加されます。
最新のシェルは、最後のコマンドの出力が改行文字で終わらない時期を検出し、視覚的表示を提供することによってこの問題を解決しますzsh
。fish
そしてzsh
:
prompt% xsel -p
xsel%
prompt%
(%
欠落している改行後の反転画像を示します。)xsel
そしてfish
:
prompt ~> xsel -p
x⏎
prompt ~>
最新バージョンはxsel
あなた自身の視覚的な印を提供します。
bash-4.4$ xsel -b
xsel
\ No newline at end of selection
bash-4.4$
これは、xselが以前の対話型シェルのプロンプトで実行されている場合にのみ機能します。
特に、「no newline」ディレクティブは、次のように使用する場合は望ましくありません。
selection=$(xsel -b)
(ここでxsel
stdoutはパイプです)または:
xsel -b > selection.txt
(ここでxsel
stdoutは通常のファイルです)。
これがxsel
、この表示がstdoutがttyデバイスに行くときにのみ出力される理由です。
今どこに表示されますか?まあ、目的はそれをttyデバイスに表示することです。 straceで実行すると、以下が表示されます。
$ strace -e write ./xsel -b
write(1, "xsel", 4xsel) = 4
write(2, "\n\\ No newline at end of selectio"..., 34
\ No newline at end of selection
) = 34
+++ exited with 0 +++
これは確認します源泉:stderrとして出力されます。 stdoutが端末でない場合:
$ strace -e write ./xsel -b > /dev/null
write(1, "$ strace -e write ./xsel -b | ca"..., 104) = 104
+++ exited with 0 +++
まったく出力ではありません。これで、その通知を端末に出力する意図があるときにstderrに出力するのは少し愚かなことです(たとえば、stderrはログファイルにリダイレクトされる可能性があります)xsel -b 2> logfile
。
- 通常、stdoutが端末装置の場合、stderrも端末装置です。
- つまり、端末で実行中に通知を無効にすることができ
xsel -b 2> /dev/null
ますxsel -b | cat
。 isatty()
端末に接続されていないシリアルデバイスの場合はtrueを返します。
答え2
テストは簡単です:
xsel -b > xsel.out 2> xsel.err
メッセージは 2 つのファイルのいずれかにあります。存在する場合、xsel.out
メッセージは stdout 経由で配信され、他のファイルに存在する場合は stderr 経由で配信されます。次は非常に奇妙なことが進んでいるので、カーネルと長い間話す必要があります。 。