Pytanie Udawaj, że jesteś tty w bashu dla dowolnego polecenia [duplicate]


To pytanie już zawiera odpowiedź:

Kiedykolwiek używam grepi podłączam go do innego programu, do --color opcja nie jest przestrzegana. Wiem, że mógłbym użyć --color=always, ale pojawia się również kilka innych poleceń, które chciałbym uzyskać dokładne dane wyjściowe tego polecenia, jako wynik, który otrzymam, gdybym był w tty.

Moje pytanie brzmi: czy możliwe jest podstępne polecenie, że polecenie jest wykonywane wewnątrz tty?

Na przykład działa

grep --color word file # Outputs some colors
grep --color word file | cat # Doesn't output any colors

Chciałbym móc napisać coś takiego:

IS_TTY=TRUE grep --color word file | cat  # Outputs some colors

To pytanie wydaje się mieć narzędzie, które może zrobić, co chcę:pusty - uruchom procesy i aplikacje pod pseudoterminalem (PTY), ale z tego, co mogłem przeczytać w dokumentach, nie jestem pewien, czy może to pomóc w moim problemie


16
2017-10-02 15:28


pochodzenie


zdajesz sobie z tego sprawę --color zmienia rzeczywisty strumień danych, który jest wysyłany do polecenia w dalszej części potoku? Konsekwencją byłoby złamanie innego rozsądnego rozsądnego kodu, ponieważ searchTarget nie jest ^[32;4gsearchTarget^[32;h (lub podobne). Powodzenia. - shellter
Tak, zdaję sobie sprawę, że w moich skryptach nigdy nie użyję tej techniki do koloru greps, ale niektóre polecenia, których używam, wydają się wyprowadzać coś innego, gdy są używane poza tty (na przykład ag , silvertarchera, ale także mocha, ...) i nie mam czasu, aby nauczyć się wszystkich opcji drukowania w tym samym formacie za każdym razem, gdy przesyłam te polecenia do innych) - edi9999
Hmmm ... Wydaje mi się, że tak się stało wcześniej z kilkoma zaskakującymi odpowiedziami (dla mnie). Wiele szukałeś [linux] (or) [bash] --color? Powodzenia. - shellter
Szukałem trochę, ale nie znalazłem niczego, co rozwiązałoby mój problem. - edi9999
Czy próbowałeś któregokolwiek z tych: stackoverflow.com/questions/1401002/...  stackoverflow.com/questions/4233808/...  rachid.koucha.free.fr/tech_corner/pty_pdip.html - Caaarlos


Odpowiedzi:


Istnieje wiele opcji opisanych przez kilka innych odpowiedzi związanych z przepełnieniem stosu (patrz Caarlos„s komentarz). Podsumuję je tutaj:

  1. Posługiwać się script + printf, nie wymaga żadnych dodatkowych zależności:

    0<&- script -qfce "ls --color=auto" /dev/null | cat
    

    Lub wykonaj funkcję basha faketty enkapsulować:

    faketty () {
        script -qfce "$(printf "%q " "$@")"
    }
    faketty ls --color=auto | cat  
    

    Lub w skorupie ryb:

    function faketty
        script -qfce "(printf "%q " "$argv")"
    end
    faketty ls --color=auto | cat 
    

    (Kredyt idzie na to odpowiedź)

    http://linux.die.net/man/1/script

  2. Użyj unbuffer dowództwo (jako część expect pakiet poleceń), niestety wymaga to zainstalowania 50mb +, ale jest to najłatwiejsze rozwiązanie:

    sudo apt-get install expect-dev
    unbuffer -p ls --color=auto | cat  
    

    Lub jeśli korzystasz z muszli ryb:

    function faketty
        unbuffer -p $argv
    end
    faketty ls --color=auto | cat 
    

    http://linux.die.net/man/1/unbuffer 

Jest to świetny artykuł na temat działania TTY i tego, czym są Pseudo-TTY (PTY), warto się przyjrzeć, czy chcesz zrozumieć, w jaki sposób powłoka linuksowa działa z deskryptorami plików, aby przekazać dane wejściowe, wyjściowe i sygnały. http://www.linusakesson.net/programming/tty/index.php


12
2017-10-06 23:26



Dodaj -e do script aby zwrócić zwróconą wartość polecenia. Rozważ także instalację rurową less -FXurktóry wyświetli kolory i nic nie zrobi, jeśli wynik będzie pasował na jednym ekranie (i poprawi wydanie \ r jeśli je masz). - Tom Hale
script: illegal option -- f  na macosx - Mike Graf
script -t 0 jest równa script -fmożesz użyć tych opcji zamiast na Macu. - Nick Sweeting