ティーパイプと名前付きパイプの使い方は?

ティーパイプと名前付きパイプの使い方は?

画像を読み取ってクリップボードに書き込んでいる間に表示する簡単なコマンドを作成しようとしています。私が試したことと失敗した理由は次のとおりです。

cat pic.png | tee >(xclip -selection clipboard -t image/png -i) | display -

表示された画像が見えないので失敗します。後ろにxclipプロセスが終了します

maim -s | tee >(display -) | xclip -selection clipboard -t image/png

これも失敗します。なぜなら、画像がクリップボードに保存されるまで保存されないからです。後ろに表示処理が終了する。

maim -s | tee >(display -) >(xclip -selection clipboard -t image/png)
maim -s | tee >(xclip -selection clipboard -t image/png) >(display -)

これら2つも失敗し、それぞれケース1および2と同様に動作します。

一時ファイルに依存しないか、作成した直後にクリップボードを読み取らなくてもこれは可能ですか?

修正する:

sを接続するとtee奇妙な結果になります。

maim -s | tee >(display -) | tee >(xclip -selection clipboard -t image/png)

この部分は機能してdisplay画像全体を表示しますが、クリップボードには破損または不完全なコピーのみが含まれています。つまり、GIMPに貼り付けると10%だけ貼り付け、残りは灰色で表示されます。並列例:クリップボードの内容をGIMPに表示して貼り付けます。

ここに画像の説明を入力してください。

maim -s | tee >(xclip -selection clipboard -t image/png) | tee >(display -) 

これも部分的に機能し、画像全体がクリップボードに配置されますが、エラーは表示されません。

display: no decode delegate for this image format `' @ error/constitute.c/ReadImage/566.

アップデート2:

まあ、携帯性はもちろん、「エレガントな」方法でこれを行う簡単な方法ではないようです。したがって、最良の方法は3つのステップで行うことです。

  1. パイプ2本作成mkfifo /tmp/p1 /tmp/p2
  2. イメージを取り、そのパイプに書き込みます。maim | tee /tmp/p1 /tmp/p2
  3. 両方のパイプで同時に読み取るdisplay < /tmp/p1 & xclip ... < /tmp/p2

2行にすることもできますが、ポイントがわかります。

別の解決策は、マニュアルページでxclipのフィルタフラグを使用することです。

   -f, -filter
          when xclip is invoked in the in mode with output level set to silent (the defaults), the filter option will cause xclip to print the text piped to standard in back to standard out unmodified

したがって、次のようになります。

maim -s -f png | xclip -i -f -selection clipboard -t image/png | display

これがxclipを使用する最良の方法であり、予想される方法のようです。

ベストアンサー1

データ全体をメモリにある程度バッファリングする必要があります。つまり、tmpファイルに書き込むこともできます/dev/shm

別のオプションはバッファプログラムです。

tee <pic.png >(buffer | xclip -selection clipboard -t image/png -i) | display -

bufferファイルサイズを事前に確認し、bufferそれに応じてオプションを設定するのに十分なメモリを使用する必要があります。

おすすめ記事