Biorąc pod uwagę polecenie, które zmienia swoje zachowanie, gdy jego dane wyjściowe trafiają do terminala (np. Produkują kolorowe dane wyjściowe), jak można przekierować dane wyjściowe w potoku, zachowując zmienione zachowanie? Musi być na to narzędzie, którego nie jestem świadomy.
Niektóre polecenia, na przykład grep --color=always
, mają flagi opcji, które wymuszają zachowanie, ale pytanie brzmi, jak obejść programy, które polegają wyłącznie na testowaniu deskryptora pliku wyjściowego.
Jeśli to ma znaczenie, moja powłoka jest bash
w systemie Linux.
Odpowiedzi:
Możesz uzyskać to, czego potrzebujesz, używając
unbuffer
.unbuffer
totcl
/expect
skrypt. Spójrz na źródło, jeśli chcesz. Zwróć również uwagę na sekcję OSTRZEŻENIA u mężczyzny.Należy również pamiętać, że nie wykonuje aliasów takich jak:
chyba że ktoś doda lewę, jak zauważył Stéphane Chazelas:
Jeśli zrobisz
alias unbuffer='unbuffer '
(zwróć uwagę na spację końcową), aliasy zostaną rozwinięte pounbuffer
.źródło
alias unbuffer='unbuffer '
(zwróć uwagę na spację końcową), aliasy zostaną rozwinięte pounbuffer
.unbuffer
to jest!sudo apt install expect
- To było niejasne.Historia zestawów narzędzi
Nie jesteś pierwszą osobą, która chce takiego narzędzia. Ludzie chcą takich narzędzi od 30 lat. I istnieją też prawie tak długo.
Najwcześniejszym narzędziem do tego rodzaju rzeczy był pakiet „pty” Daniela J. Bernsteina, opisany przez Richa Salz'a jako „nóż Ginsu”, który Bernstein napisał na przełomie lat 90. XX wieku, aby oszukiwać w nethacku (sic!). Wersja 4 pakietu „pty” została opublikowana w 1992 r. Do
comp.sources.unix
(tom 25, numery 127–135). Nadal można go zlokalizować w sieci WWW. Paul Vixie opisał to wtedy:Bernstein później zaktualizował to, gdzieś w dniu 1999-04-07 lub wcześniej, o pakiet „ptyget”, który ogłosił:
Ten oddzielny pakiet był pakietem „sess”.
Nawiasem mówiąc, „ptyget” jest godnym uwagi przykładem bardzo wczesnej wersji i jednego z niewielu opublikowanych przypadków własnego, niepublikowanego systemu kompilacji „przerobić” Bersteina.
dependon
jest wyraźnym prekursoremredo-ifchange
.Stosowanie
ptybandage
ptybandage
to jest to, czego ludzie zwykle chcą podczas sesji logowania. Jego podstawowym zastosowaniem jest tworzenie programów, które są wrażliwe na to, czy ich standardowe dane wejściowe, wyjściowe lub błędy są podłączone do terminali, działają w ten sposób, nawet jeśli faktycznie znajdują się w potokach powłoki, lub ich standardowe deskryptory plików są przekierowywane do pliku.Zajmuje polecenia do uruchomienia (który musi być właściwa komenda zewnętrzny, oczywiście) i uruchamia go w taki sposób, że uważa, że jego standardowe wejście, wyjście i błąd są dołączone do terminala, podłączenie tych aż do
ptybandage
„s oryginalne standardowe wejście, wyjście i błąd.Zajmuje się niuansami działania pod powłokami kontroli zadań, zapewniając, że znak STOP terminala nie tylko zatrzymuje się,
ptybandage
ale także zatrzymuje działanie programu podłączonego do wewnętrznego terminalu.ptyrun
ptyrun
to jest to, czego ludzie zwykle chcą na serwerach sieciowych TCP. Jego podstawowym zastosowaniem są środowiska zdalnego wykonywania, które same nie skonfigurowały terminali, uruchamiając programy, które nie działają zgodnie z oczekiwaniami, gdy nie ma terminala.Nie oczekuje się, że będzie działał pod powłoką kontroli zadania, a jeśli uruchamiane polecenie otrzyma sygnał zatrzymania, zostanie po prostu ponownie uruchomiony.
Dostępne zestawy narzędzi
Dru Nelson publikuje zarówno wersję „pty” 4, jak i „ptyget”.
Paul Jarc publikuje poprawioną wersję ptyget, która próbuje poradzić sobie z ioctlami pseudoterminalnymi specyficznymi dla systemu operacyjnego w oryginale, których systemy operacyjne w rzeczywistości nie zapewniają.
Pakiet źródłowy nosh zawiera podobne do niego skrypty
ptybandange
iptyrun
skrypty, które używająexecline
narzędzia Laurenta Bercot'a oraz własnych pseudoterminalnych poleceń zarządzania pakietem nosh. Od wersji 1.23 nosh są one dostępne w pakiecie z pakietem dodatków terminal-nosh. (Wcześniejsze wersje dostarczały je tylko osobom, które budowały ze źródła).Kilka przykładów zastosowań
Jurjgen Oskam używa
ptybandage
w systemie AIX do wprowadzania danych wejściowych z dokumentu tutaj do programu, który otwiera explicity, i odczytuje terminal sterujący w celu wyświetlenia hasła:Andy Bradford używa
ptyrun
na OpenBSD pod daemontools i ucspi-tcp, aby programbgplgsh
interaktywnego sterowania routerem był dostępny przez sieć, jednocześnie myśląc, że rozmawia z terminalem:Dalsza lektura
redo
. Często udzielane odpowiedzi.bgplgsh
. 8. Strony podręcznika OpenBSD.źródło
expect
?Możesz użyć socat, aby rozpocząć proces z podłączonym pty i uzyskać od socat połączenie drugiego końca pty z plikiem. Które AFAIU jest dokładnie tym, o co prosiłeś:
Ta metoda spowoduje, że
isatty
wywoływany przezmy-command
return,true
a proces, który opiera się tylko na tym, zostanie oszukany do wyjściowych kodów sterujących. Zauważ, że niektóre procesy (zwłaszczagrep
) również sprawdzają wartośćTERM
zmiennej środowiskowej, więc może być konieczne ustawienie jej na coś rozsądnego, na przykład"xterm"
źródło
Jest też dobre rozwiązanie zamieszczone tutaj na Super User przez KarlC :
Skompiluj małą bibliotekę współdzieloną:
Następnie powiedz swojemu poleceniu, aby
isatty(3)
dynamicznie ładowało to zastąpienie:Może to nie działać w przypadku każdego polecenia, może nawet złamać niektóre w nieoczekiwany sposób, ale prawdopodobnie zadziałałoby w większości przypadków.
źródło
DYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
Co powiesz na używanie
script(1)
?Na przykład:
Zapisuje dane
ls
wyjścioweout_file
z zachowanymi kodami kolorów.źródło
out_file
kolorów?less -R
. Jednak w tym przypadku chciałem, aby dane wyjściowe były kontynuowane w potoku, co ostatecznie zakończyło się w moim terminalu. Używająccat
ilustracji, było to coś w rodzajuscript -q -c 'ls -G' /dev/null | cat
, cotypescript
całkowicie pomija plik, pozostawiając jedynie wyjście programu.-
) jakoscript
pliku wyjściowego, na przykład:script -q -c 'ls -G' -
W oparciu o odpowiedź @ Amir , oto skrypt, który generuje, a następnie dołącza bibliotekę w czasie wykonywania:
źródło