Chcę wykonać jakąś akcję tylko wtedy, gdy moja powłoka jest „podłączona” do terminala, tj. Tylko wtedy, gdy moje standardowe wejście pochodzi z wejścia terminala, a moje standardowe wyjście (i standardowy błąd? Może to nie ma znaczenia) zostanie wydrukowane / echo terminal.
Jak mogę to zrobić bez bezpośredniego polegania na specyfikach GNU / Linux /proc/self
?
command-line
terminal
einpoklum - przywróć Monikę
źródło
źródło
Odpowiedzi:
isatty
jest funkcją sprawdzającą to , a-t
flagatest
polecenia czyni to dostępnym ze skryptu powłoki:Możesz sprawdzić, czy FD 0 (standardowe wejście) jest TTY za pomocą:
Możesz zrobić to samo dla FD 1 i 2, aby sprawdzić strumienie wyjściowe i strumienie błędów lub wszystkie:
Polecenie zwraca 0 (sukces), jeśli deskryptory są podłączone do terminala, w przeciwnym razie ma wartość false.
test
jest również dostępny jako[
polecenie „testu wspornika”:jest idiomatycznym sposobem na napisanie tego warunkowego.
źródło
Wyobrażam sobie, że to duplikat, ale nie mogę go znaleźć. Posługiwać się
i
odpowiednio sprawdzić, czy standardowe wejście i wyjście są podłączone do terminala.
man test
ma szczegóły.źródło
Tylko dodatkowa uwaga na podstawie już udzielonych dobrych odpowiedzi. Zauważ, że
[ -t 0 ]
testy, w których deskryptor pliku 0 jest otwarty, to plik, który jest plikiem urządzenia z dyscypliną linii tty (zazwyczaj odbywa się to poprzez sprawdzenie, czy nieszkodliwe termio (s) ioctl () się powiedzie).Nie musi to również oznaczać, że na drugim końcu znajduje się terminal lub emulator terminala (z prawdziwym użytkownikiem, który pisze na klawiaturze) (choć w ogromnej większości przypadków i prawdopodobnie większości z nich zależy), to wystarczająco przybliżenie).
Urządzenia tty i pty mogą być również wykorzystywane do przesyłania danych lub jako mechanizm komunikacji międzyprocesowej.
Na przykład można zrobić:
Karmić to, co otrzymano przez RS232 do
myscript
.miałby
myscript
stdin będący urządzeniem pty (zsshd
drugim końcem, a ostatecznie (przez połączenie ssh) nie terminalem, ale zasilaną przez niego rurąecho
)Aby dodatkowo sprawdzić, czy na drugim końcu linii RS232 lub pty znajduje się terminal, możesz również sprawdzić, czy
$TERM
zmienna jest ustawiona i niepusta ([ -n "$TERM" ]
), i wysłać sekwencję ucieczki raportu o stanie urządzenia za pomocą tego fd i sprawdzić, czy otrzymałeś odpowiedź (oprócz[ -t 0 ]
i[ -n "$TERM" ]
).Odpowiada na to
\e[0n
przez większość terminali.Teraz jest z tym kilka problemów, więc nie zalecałbym tego, z wyjątkiem sytuacji, w której chcesz to sprawdzić, ponieważ chcesz uruchomić wizualną aplikację TUI (w takim przypadku lepiej byłoby użyć bibliotek takich jak
ncurses
, i zamiast DSR, wolisz wysłać sekwencję ucieczki identyfikującą urządzenie, aby zapytać o typ terminala bardziej precyzyjnie niż za pośrednictwem$TERM
):printf
awarię, ale w przypadku, gdy stdin jest urządzeniem tty otwartym w trybie odczytu i zapisu, będzie to miało efekt uboczny wysłania tej sekwencji na drugi koniec. Na przykład w naszym powyższym przykładzie ssh, który faktycznie wyśle sekwencję do terminala (ale odpowiedź nie pojawi się na standardowym wejściu)źródło