Próbuję wykonać odwrotność od „ Wykryć, czy stdin to terminal czy potok? ”.
Uruchamiam aplikację, która zmienia swój format wyjściowy, ponieważ wykrywa potok na STDOUT i chcę, aby myślał, że jest to terminal interaktywny, aby podczas przekierowywania otrzymywał te same dane wyjściowe.
Myślałem, że owinięcie tego w expect
skrypt lub użycie proc_open()
w PHP by to zrobiło, ale tak nie jest.
Jakieś pomysły?
Odpowiedzi:
Aha!
script
Komenda robi to, co chcemy ...Zrób sztuczkę!
źródło
script
jest nawet dostępny w BusyBox !less -R
, do którego trafia wejście terminalaless -R
, potrzebujesz dodatkowej sztuczki. Na przykład chciałem mieć kolorową wersjęgit status | less
. Musisz przejść-R
do mniej, aby uszanować kolory, i musisz użyć,script
aby uzyskaćgit status
kolor wyjściowy. Ale nie chcemyscript
zachować własności klawiatury, chcemy, żeby to się stałoless
. Więc używam to teraz i to działa dobrze:0<&- script -qfc "git status" /dev/null | less -R
. Tych kilka pierwszych znaków zamyka standardowe wejście dla tego jednego polecenia.$-
zmienną powłoki „i”.Py_Initialize
nie widziałem prawidłowego stdin / stderr.Opierając się na rozwiązaniu Chrisa , wymyśliłem następującą małą funkcję pomocniczą:
Dziwaczny wygląd
printf
jest konieczny, aby poprawnie rozwinąć argumenty skryptu,$@
jednocześnie chroniąc ewentualnie cytowane części polecenia (patrz przykład poniżej).Stosowanie:
Przykład:
źródło
--return
opcji, jeśli twoja wersjascript
ma ją, aby zachować kod zakończenia procesu potomnego.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
W przeciwnym razie plik o nazwietypescript
zostanie utworzony za każdym razem, gdy zostanie uruchomione polecenie, w wielu przypadkach.script: illegal option -- f
Unbuffer skrypt, który pochodzi z Oczekiwać należy obsługiwać ten przycisk OK. Jeśli nie, aplikacja może patrzeć na coś innego niż to, do czego jest podłączone jej wyjście, np. jaka jest wartość zmiennej środowiskowej TERM.
źródło
Nie wiem, czy jest to wykonalne z PHP, ale jeśli naprawdę potrzebujesz procesu potomnego, aby zobaczyć TTY, możesz utworzyć PTY .
W C:
Właściwie miałem wrażenie, że
expect
sam tworzy PTY.źródło
Odwołując się do poprzedniej odpowiedzi, w systemie Mac OS X można użyć „skryptu” jak poniżej ...
Ale ponieważ może zamienić „\ n” na „\ r \ n” na standardowym wyjściu, możesz również potrzebować takiego skryptu:
Jeśli między tymi poleceniami znajduje się potok, musisz opróżnić stdout. na przykład:
źródło
Zbyt nowy, by skomentować konkretną odpowiedź, ale pomyślałem, że podążę za
faketty
funkcją opublikowaną przez ingomueller-net powyżej, ponieważ ostatnio mi pomogła.Odkryłem, że tworzyło to
typescript
plik, którego nie chciałem / potrzebowałem, więc dodałem / dev / null jako plik docelowy skryptu:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }
źródło
Aktualizacja odpowiedzi @ A-Ron na a) działa na obu Linux i MacOs b) propaguje kod statusu pośrednio (ponieważ MacOs
script
go nie obsługuje)Przykłady:
źródło
Próbowałem uzyskać kolory podczas pracy
shellcheck <file> | less
, więc wypróbowałem powyższe odpowiedzi, ale dają one ten dziwny efekt, w którym tekst jest przesunięty w poziomie w stosunku do miejsca, w którym powinien być:(Dla tych, którzy nie są zaznajomieni z funkcją Shellcheck, wiersz z ostrzeżeniem powinien pokrywać się z miejscem, w którym występuje problem).
Aby powyższe odpowiedzi działały z shellcheck, wypróbowałem jedną z opcji z komentarzy:
To działa. Dodałem także
--return
i użyłem długich opcji, aby to polecenie było trochę mniej nieodgadnione:Działa w Bash i Zsh.
źródło
W przykładowym kodzie książki „Zaawansowane programowanie w środowisku UNIX, wydanie drugie” znajduje się również program pty!
Oto jak skompilować pty w systemie Mac OS X:
źródło