xselは改行なしの警告をどのストリームに出力しますか?

xselは改行なしの警告をどのストリームに出力しますか?

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)。最後に、次のプロンプトが選択に追加されます。

最新のシェルは、最後のコマンドの出力が改行文字で終わらない時期を検出し、視覚的表示を提供することによってこの問題を解決しますzshfish

そして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)

(ここでxselstdoutはパイプです)または:

xsel -b > selection.txt

(ここでxselstdoutは通常のファイルです)。

これが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を返します。

おすすめ記事