W drugiej metodzie zaproponowanej przez tę stronę otrzymujemy tty, w którym uruchamiany jest bash za pomocą polecenia:
ps ax | grep $$ | awk '{ print $2 }'
Pomyślałem sobie, że z pewnością jest to trochę leniwe, wymieniając wszystkie uruchomione procesy tylko po to, aby wyodrębnić jeden z nich. Czy nie byłoby bardziej wydajne (pytam również, czy wprowadziłoby to niepożądane efekty):
ps -p $$ | tail -n 1 | awk '{ print $2 }'
Do twojej wiadomości natknąłem się na ten problem, ponieważ czasami pierwsze polecenie faktycznie dało dwie (lub więcej) linii. Stałoby się to losowo, gdy byłby uruchomiony inny proces z PID, który zawiera $$
jako podłańcuch. W drugim podejściu unikam takich przypadków, żądając PID, o którym wiem, że chcę.
tty
polecenia w sesji bash. Jeśli nalegasz na użycieps
-ps -p $$ -o tty=
Odpowiedzi:
Po prostu wpisując
tty
:Zbyt proste i oczywiste, aby mogło być prawdziwe :)
Edycja: Pierwszy zwraca ci również
pty
przebieg procesu,grep
jak możesz zauważyć:dlatego musisz odfiltrować grep, aby uzyskać tylko jeden wynik, który staje się brzydki:
lub używając
(bardziej rozsądny wariant)
źródło
tty | sed -e "s:/dev/::"
). Myślę jednak, że drugie sugerowane rozwiązanie na tej stronie jest nie tylko nieefektywne, ale również błędne! Wykorzystamtty
i przestanę narzekać. :)pty
przebieg procesu,grep
jak możesz zauważyć.grep
jeśli używaszawk
. np.ps ax | awk "/^$$/ {print \$2}"
- zwróć uwagę na użycie podwójnych cudzysłowów zamiast pojedynczych cudzysłowów i znak ucieczki\$2
. Ale, jak mówisz, używanietty
jest właściwym rozwiązaniem.awk -vpid=$$ '$1 == pid {print $2}'
tty
zauważam tutaj, że spawnowanie w node.js w ogóle nie działa, aps
przyjaciele działają dobrze.Jeśli chcesz być bardziej wydajny, to tak, masz rację, że
ps
możesz filtrować tylko do danego procesu (i będzie to bardziej poprawne, nie ryzykując wybrania poleceń, które akurat mają twój numer procesu w nazwie) ). Ponadto można powiedzieć, aby nie generował nagłówka (opcjah
), eliminująctail
proces i wyświetlał tylkoTTY
pole (opcjao tty
), eliminującawk
proces.Oto twoje ograniczone polecenie:
źródło
Inne sposoby na zrobienie tego:
(Jeśli znajdujesz się w powłoce, której stdin, stdout i stderr nie są podłączone do terminala sterującego, możesz uzyskać deskryptor pliku do terminala sterującego, otwierając
/dev/tty
:)
Lub z
ps
:źródło
/dev/tty
, a nie kontrolny tty (jak donosips
). (2) Wierzę, że{ readlink /dev/fd/0; } < /dev/tty
jest (i zawsze będzie) równoważnereadlink /dev/fd/0 < /dev/tty
- czy wierzysz inaczej? Jeśli tak, czy możesz to uzasadnić? (3) Drugi średnik w twoim poleceniu (następny po/dev/tty
) jest niepotrzebny.Dla kompletności, podczas gdy inne wspomniane polecenia ps działają w systemie Linux
ps -p $$ -o tty=
(jak wspomniano w @ 1_CR) jest najbardziej przenośny dla wszystkich współczesnych systemów uniksowych, ponieważ używa tylko opcji zdefiniowanych w standardzie Unix .źródło
W interaktywnej powłoce można
w
do tego użyć polecenia. W poniższym przykładziew
raporty są uruchamiane przez określonego użytkownika i, oczywiście, pokazuje TTY, gdzie to polecenie jest uruchamiane.źródło