標準出力リダイレクトは、改行文字のない行を無視します。

標準出力リダイレクトは、改行文字のない行を無視します。

stderr端末から赤で印刷しようとしています。次のスクリプトは、カスタマイズ時に2デバッグトラップにリダイレクトされます。8

exec 9>&2
exec 8> >(
    while IFS='' read -r line || [ -n "$line" ]; do
       echo -e "${RED}${line}${COLORRESET}"
    done
)
function undirect(){ exec 2>&9; } # reset to original 9 (==2)
function redirect(){ exec 2>&8; } # set to custom 8
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'

それから来るここ、明確な説明と共に。

正常に動作しているようですが、改行ではない入力はまったく印刷されません。著者の引用福音再:

bash> echo -en "hi\n" 1>&2
    hi       <-- this is red
bash> echo -en "hi" 1>&2
bash> echo -en "hi" 1>&2
bash> echo -en "hi\n" 1>&2
    hihihi   <-- this is red

理由がわからない。改行ではない内容は一種のバッファにあるようです。ファイルディスクリプタに到達しないか、8何とかすぐに印刷したくありません。どこに行きますか?redirect毎回正しく呼び出されます。また、IFS=''区切り文字がないという意味なので、エコーが1行ずつ発生する理由をよく理解できません8

バグ修正は非常に感謝し、この質問に引用された回答をリンクさせていただきます。

Gilesが指摘したように、ソリューション全体は完璧ではありません。読み取り、標準入力、進行状況バーに問題があります。することもsuできませんsource。パイプ破裂、予期しない端子出口などの主な問題が頻繁に発生します。誰もが私のリンクを介してここに到達したら、その使用を検討してください。https://github.com/sickill/stderred代わりにはるかに良いです(まだ問題ありません)(しかしecho bla >&2まだ赤ではありません。該当する質問が閉じました。)

ベストアンサー1

改行文字が印刷される同じ行の一部として部分行出力を取得します。行の一部は内部でバッファリングされますreadこれがすることです:

これ読むユーティリティは標準入力から単一の論理ラインを読み取る必要があります。

たとえば。<foobar>代わりに1秒後に印刷してください<foo><bar>

(echo -n foo ; sleep 1 ; echo bar) | (read x ; echo "<$x>")

完全な行より小さい入力をキャプチャするには、Perlを使用するなど、他の操作を実行する必要があります。これは印刷されます(.とは異なり、Perlは最後の改行を具体的に処理しないため、最後の改行の<foo><bar\n>前に改行があります。色付けとは関係ありません。)>read

(echo -n foo ; sleep 1 ; echo bar) | 
    perl -e '$|=1; while(sysread STDIN,$a,9999) { print "<$a>"}'

環境の色(および)の制御コードをエクスポートした場合は、REDPerlスクリプトで次のように使用できます。COLORRESET

perl -e '$|=1; while(sysread STDIN,$a,9999) {print "$ENV{RED}$a$ENV{COLORRESET}"}'

おすすめ記事