Hogy lehet hogy átirányításkor más a kimenet fájlba, mint ami a konzolon látszik?

Sziasztok, deluge torrent kliens-től parancssorban lehet információkat kérni:

'deluge-console info' -t parancssorba beírva szépen kiír mindent az éppen futó letöltésekről.

de: ha ezt átirányítom fájlba, akkor ugyan az a szöveg, amit az előbb teljesen jól kiírt a konzolra,
hibaüzenettel megszakad:

-------------------------------
deluge-console info >> teszt.txt

teszt.txt-ben:

Error getting torrent info: [Failure instance: Traceback: : 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)
... és még sok sor.
----------------------------------------------------

próbáltam így is: deluge-console info 1> teszt.txt, eredmény ugyan az.

Kérdés 1: hogy lehetséges, hogy más a kimenet fájlba, mint konzolra? Eddig azt hittem, hogy az átirányított programnak tudomása sincs az átirányítás tényéről, itt pedig látszik, hogy az elképzelésemmel ellentétben nem igaz, hogy program->kimenet-> másik fájl, hanem program->másik fájl átirányítás történik, és a kiíró program számára más felület látszódik, mint egy normális konzol.

Kérdés 2: hogy lehet úgy lementeni a konzol kimenetét, hogy a kiemenetet író program azt higgye, hogy konzolra ír?

próbáltam még 'deluge-console info | tee fajlnev.txt' módon is átirányítani, úgy sem ment.

Köszönöm dio

Hozzászólások

(ez csak subscribe kíváncsiságból, eddig végül mindig megúsztam hogy utána kelljen nézni, de azért annyira fura nem kellene legyen számodra, hisz nagyon sok program van ami a konzolra mindenféle szépítéseket, fénylő betűk, aláhízások szerepelnek, amik már fájlba/csőbe irányítva nem, vagy egy tipikusan bináris kimenettel rendelkező program (pl kitömörítő) beszól ha véletlen a konzolra irányítod...)

Szia, persze ez lehetséges hogy vannak egyedi formázások egy kimenetben, de alaposan megnéztem: tök sima egyszerű betűket ír ki a 'deluge-console info'

ráadásul az átirányított kimenetbe elkezdi a szöveget belerakni, majd jó pár olvasható sor után jön a unicode hiba.

vagyis valahol szerintem van egy karakter, amit a konzolra ki tud írni, de az átirányításon nem megy át.

Ezt nem értem, hogy hogy lehet hogy van olyan betű ami olvasható, rendezett szövegben látszik a konzolon, de az átirányításban nem.

Szia, dio

maga a program kapja meg hogy hova írjon, nem egy levegőben lógó cső a kimenete amit pl a shell kezel, azaz látja hova csatlakozik

hibás a deluge, próbál más kimenetet adni a konzolra mint a "stdout"-ra; most kapásból gugli://"deluge-console redirect" pl ezt adta: http://dev.deluge-torrent.org/ticket/1248 itt azt írja fixed, szóval vagy mégsem vagy régi a deluge-d

esetedben az a karakter ahol elakad ha jól látom a "Ú", ami kilóg az ascii-ból ahogy írja is

tehát ha a deluget nem tudod rávenni hogy jól működjön, akkor a konzolt magát kell átirányítanod

Egyetlen UNIX program esetén sem szabad feltételezni, hogy átirányítással ugyanaz lesz a kimenet, mint anélkül:


$ perl -E 'say "STDOUT is ", -t STDOUT ? "a tty" : "not a tty"' 
STDOUT is a tty
$ perl -E 'say "STDOUT is ", -t STDOUT ? "a tty" : "not a tty"' | cat
STDOUT is not a tty

Nem tudom, hogy ez jelentette-e a problémát, de gondoltam segíthet.

Azért azt is tegyük hozzá, hogy egyetlen UNIX-program esetén sem kéne másként működnie attól függően, hogy terminálra, vagy nem terminálra van-e az az STDOUT állítva. (Ellenpéldáról tudok - kezdve az ls-sel, folytatva a more/pg/less/egyéb lapozókkal -, de ettől még nem kéne így működniük.) És persze nem *magával* az átirányítással van a baj, hanem hogy az STDOUT éppen terminál, vagy nem (pl. az isatty(3) szerint). Lásd:


$ ls
$ ls | cat
$ ls > /dev/tty

parancsokat. Ahol a végeredmény mind a 3-nál a képernyőn jelenik meg, ebből az 1. és a 3. esetén ugyanúgy, pedig a 2. és a 3. esetén is van átirányítás :-) Csak ugy az STDOUT az 1. és 3. esetben terminál, míg a 2. esetben egy cső. (Ahogy itt felettem írták is.)

Azért azt is tegyük hozzá, hogy egyetlen UNIX-program esetén sem kéne másként működnie attól függően, hogy terminálra, vagy nem terminálra van-e az az STDOUT állítva.

Nem flame-nek szánom, de nem értek egyet. Kifejezetten hasznos, hogy egy grep a pattern matchet színnel is kiemeli, ha terminálra ír (újabban). Ha nem terminálba ír, akkor a színezést adó vezérlő karakterek elég sok gondot okoznának, ezért "kihagyja" őket. Ez kényelmi kérdés, és nem is sérti a UNIX filozófiát.

A gömb nem attól jó, hogy kocka formájú.