2010-08-02 14 views
12

Czy istnieje standardowy (ish) POSIX sposób ustalania, czy mój proces (piszę to teraz jako skrypt Ruby, ale jestem ciekawy dla wielu środowisk, w tym aplikacji wiersza poleceń Node.js i ISO C) jest uruchamiany w terminalu interaktywnym, w przeciwieństwie do, powiedzmy, crona, lub wykonania z innego narzędzia, lub ... tak dalej i tak dalej.Jak ustalić, czy mój proces jest uruchamiany interaktywnie?

W szczególności potrzebuję uzyskać dane wejściowe użytkownika w pewnych sytuacjach i muszę zakończyć się niepowodzeniem, jeśli jest to możliwe nie jest możliwe (tzn. Uruchamiane przez crona.) Mogę to zrobić ze zmienną środowiskową, ale " Wolę coś bardziej standardowego, jeśli mogę.

+2

Dla każdego, kto przyszedł tutaj, szukając okien, spróbuj użyć System.Environment.UserInteractive dla .Net lub GetUserObjectInformation dla win32, co nie powiedzie się dla procesów nieinteraktywnych. – Mitch

+0

Mogłeś dodać to jako faktyczną odpowiedź i zdobyć z niej reputację. (= – ELLIOTTCABLE

Odpowiedz

13

Zawsze używałem $stdout.isatty, aby to sprawdzić. Inne podejścia mogą obejmować sprawdzenie wartości ENV['TERM'] lub użycie klejnotu ruby-terminfo.

+1

'isatty' wydaje się być częścią klasy ruby ​​IO: http://ruby-doc.org/core-2.2.2/IO.html#method-i-isatty – akostadinov

4

Najbliższe, które otrzymasz, AFAIK, jest isatty(). Ale jak mówi sama strona, nic nie gwarantuje, że człowiek kontroluje terminal.

Powiązane problemy