git stderrを出力できないパイプ
-
27-09-2019 - |
質問
書いグラフィカルなURIのハンドラのためのgit://リンクbashとzenity、使用していzenity'テキスト情報"ダイアログにgitのクローンを出力での走行は、FIFO。のスクリプトは、約90線が長いので、かなり狭いですがこちらの最も重要な路線
git clone "$1" "$target" 2>&1 | cat >> /tmp/githandler-fifo &
cat /tmp/githandler-fifo | zenity --text-info --text='Cloning git repository' &
私はFIFOではなく直接のパイプを利用できる非同期に実行することで殺害gitの場合はzenityウィンドウが閉じます。
問題は、ライン表示されるgitからの出力は:
Initialized empty Git repository in /home/delan/a/.git/
その他の回線数です。はいは表示されます。
現在の理由
現在の合意形成の理由としては、このきょうと cat
非ブロックおよびブロック終了後の最初の行だけを渡することにzenityいついてご覧いただけます。私の目標はブロックの読み取り、zenityのテキスト情報のダイアログを示すべての出力を得た。
git
出力の進捗メッセージ(以外のものは"初期化された"メッセージのstderr、その瞬間のようにしていパイプstderrをファイルまたは合併を標準出力に出力し、メッセージが消えます。
固定の試み1
私は書いてみました二つのブロックバージョンのねこの機能にはC、パンやbwriteす:
#include <stdio.h>
main(int argc, char **argv) {
int c;
for (;;) {
freopen(argv[1], "r", stdin);
while ((c = getchar()) != EOF)
putchar(c);
}
}
#include <stdio.h>
main(int argc, char **argv) {
int c;
for (;;) {
freopen(argv[1], "w", stdout);
while ((c = getchar()) != EOF)
putchar(c), fputs("writing", stderr);
}
}
働いているものでもブロックとイイねにEOFが、そんな問題点を解決していない。現在、使用、その他、作品を理論的にも実際には、zenityを示しています。
固定の試み2
@mvdsることを示唆を使用し、普通のファイルと組み合わせ tail -f
よ cat
, 合います。驚きなどシンプルなソリューション(!) ってみたのですが、残念なことですが、最初の行を見zenity、それ以外なにもありません。
固定の試み3
そstrace'ing検査をgitのソースコードにかかわる問題と理解するgit出力はすべて、その進捗情報(何でも過去の"初期化された"メッセージのstderrは、この最初の行はっこいい猫の禁煙プログラム"を開始早くEOFが偶然/間違った方向に誘導されたと仮定(gitなEOFまでのプログラムが終了します).
の状況もなくより簡便な、と思ってはいけない、何か変化は、元のコードの始めに質問できます。不思議し、stderr出力"消える時にリダイレクト-くだものの中で起こっているgit.
テストケース?いことを確認してくださいだいのファイル(ません):
git clone git://anongit.freedesktop.org/xorg/proto/dri2proto 2> hurr
これに反するものであるという話になりたいと思いま知ってstderrは、リダイレクション;私も書きょCプログラムを出力にstderrは、標準出力に出力したことを証明するのは、私のリダイレクトできないgit.
固定の試み4
ラJakubナレブスキ-の回答などへの回答メールを送信したのgitのメーリングリスト --progress
のオプションをするか、必要なこのオプションのみの作品の後にコマンドとなる前に clone
.
あなた方の成功を意味する。
ありがとうございてます。この固定:
git clone "$1" "$target" --progress > /tmp/githandler-fifo 2>&1 &
解決
いと思う少なくとも一部の進捗報告書が黙の場合出力 ない端末 (tty).くなった場合に適用される場合も、過去、現在、未来 --progress
オプション'gitクローン(使用 git clone --progress <repository>
).
がわからない場合はかっています。
他のヒント
一つは、出力のリダイレクトを構文解析右から左で
git clone "$1" "$target" 2>&1 > /tmp/githandler-fifo &
するものではなく、
git clone "$1" "$target" > /tmp/githandler-fifo 2>&1 &
後者はリダイレクトstderrを標準出力に出力を標準出力に出力を含むstderr)にファイルです。前者がリダイレクトを標準出力に出力ファイルへの展開にはstderrに標準出力に出力します。
としての配管へ zenity
るかと思いきものづくり複雑化したと、名前付きパイプです。を使用 strace
ありくつかの光の仕組みを理解し、物件のプロセスまでの焼成。の経験の浅い、名前付きパイプの解決を難しくしている印象に比べて通常る事に成功しました。
さらに実験をFIFOと呼ばれる、思いのが問題なのzenityプロセス、その入力します。その場合は、入zenityからキーボード?(疑い:して貰いたい、読書へのEOF.) しかし、できるzenity取り扱う端子入力(tty入力をブロックI/Oが非ブロッキングI/Oのための他のすべてのデバイスです。非ブロッキングI/Oオリンピックからの入力ファイルで望ましい入力からパイプまたはFifo。トした場合は使用を非ブロッキングI/O、zenityるのでしょう最初の行に出力し、出口よりループの考え方でしたが、その秒読み取りのことを示しますが何といってもすぐに可能です。
ここでは何が起きている(しない)することには注意を要する。私が見るのは"トラス"または"straceはその他のシステムコールモニターを追跡しうzenityしています。
どの回避策"のワンシーンの仮説が正しけをする必要がありまを説得zenityで読書端末からではないFIFOがありますので,そこでしっかりょう必要な装置、擬似tty(pty);最初の工程が書き込みのマスターのptyんで手配zenityから読み込むスレーブのpty.いまだ利用のFIFOものがでの長いコマンドです。