Proč není výstup příkazů přes watch barevný?

Pit

  • ****
  • 424
    • Zobrazit profil
    • karlos.cz
    • E-mail
Proč není výstup příkazů přes watch barevný?
« kdy: 17. 04. 2020, 22:29:02 »
Pokud pustím příkaz iostat , automaticky ho mám v barvách. Pokud si chci pustit přes watch (šikovná  věc na periodické sledování výstupu příkazu), proč musí explicitně  být zadaná proměnná  pro zapnutí barev  (před či po)? (Týká se i příkazu ls, běžně vypisuje barevně, ale přes watch to musí být watch -c ls --color)
Kód: [Vybrat]
watch -c S_COLORS=always iostat
S_COLORS=always watch -c  iostat
Podle mě je tam nějaká zvláštní magie jako zjišťování parametrů terminálu (takové ty věci jako že výstup utility htop se přizpůsobí oknu). Napadla mě ještě jiná příčina a sice výchozí proměnné prostředí, které se nepředávají do subshellu.... Co z toho to je?


PS: co znamená "double buffered" IO příkazů (údajně watch, může způsobovat "blikání" ale věřím že to nemá níc společného s VSYNC a double bufferingem u grafických karet
« Poslední změna: 18. 04. 2020, 00:30:17 od Petr Krčmář »


Tuším že přes isatty() program zjistí, zda je výstup terminál nebo pipa.

k3dAR

  • *****
  • 2 339
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
[...] proč musí explicitně  být zadaná proměnná  pro zapnutí barev [...]
protoze ji mas nastavenou na auto, viz:
Kód: [Vybrat]
set | grep ^S_COLORS

Spousta aplikací zjišťuje, zda vypisuje na terminál (a pak využívají vlastností terminálu, třeba barvičky), nebo zda vypisuje do roury (pipe), tedy na vstup jiného programu –  takovém případě vypisují jen čistý text, protože ten jiný program by byl tím  „smetím“ okolo nejspíš zmaten. watch nebo less jsou ty čestné výjimky, které si s výstupem určeným pro terminál poradí. Ale ta vypisující aplikace nemá jak zjistit, kdo je na druhém konci té roury.

Pit

  • ****
  • 424
    • Zobrazit profil
    • karlos.cz
    • E-mail
Re:Proč není výstup příkazů přes watch barevný?
« Odpověď #4 kdy: 18. 04. 2020, 11:09:52 »
OK, isatty.