Как получить tty, в котором работает bash?


25

Во втором методе, предложенном на этой странице , вы получите tty, в котором bash запускается с помощью команды:

ps ax | grep $$ | awk '{ print $2 }'

Я подумал, что это немного лениво, перечисляя все запущенные процессы только для извлечения одного из них. Разве это не было бы более эффективно (я также спрашиваю, привнесет ли это нежелательные эффекты):

ps -p $$ | tail -n 1 | awk '{ print $2 }'

К вашему сведению, я сталкивался с этой проблемой, потому что иногда первая команда фактически выдает две (или более) строки. Это произойдет случайным образом, когда будет запущен другой процесс с PID, который содержит $$в качестве подстроки. Во втором подходе я избегаю таких случаев, запрашивая PID, который, как я знаю, я хочу.


6
Ну, наиболее эффективным из всех будет запуск ttyкоманды в вашей сессии bash. Если вы настаиваете на использовании ps-ps -p $$ -o tty=
iruvar

Ответы:


47

Просто набрав tty:

$ tty 
/dev/pts/20

Слишком просто и очевидно, чтобы быть правдой :)

Редактировать: первый возвращает вам также ptyпроцесс, запущенный, grepкак вы можете заметить:

$ ps ax | grep $$
28295 pts/20   Ss     0:00 /bin/bash
29786 pts/20   S+     0:00 grep --color=auto 28295

поэтому вам нужно отфильтровать grep, чтобы получить только один результат, который выглядит ужасно:

ps ax | grep $$ | grep -v grep | awk '{ print $2 }'

или используя

ps ax | grep "^$$" | awk '{ print $2 }'

(более вменяемый вариант)


Да, это действительно первое предложенное решение (на самом деле это так tty | sed -e "s:/dev/::"). Но я думаю, что второе предлагаемое решение на этой странице не только неэффективно, но и неправильно! Я использую ttyи перестану жаловаться, хотя. :)
Sheljohn

Первый возвращает вас также ptyо том, что процесс запущен, grepкак вы можете заметить.
Jakuje

2
Вам не нужно, grepесли вы используете awk. например, ps ax | awk "/^$$/ {print \$2}"обратите внимание на использование двойных кавычек, а не одиночных кавычек и экранированных \$2. Но, как вы говорите, использование ttyявляется правильным решением.
Cas

Подобные действия могут привести к ложным совпадениям, например, если ваш PID равен 10, а также PID 103. Использованиеawk -vpid=$$ '$1 == pid {print $2}'
Barmar

Я только отмечаю, что порождение ttyв node.js не работает вообще, в то время как psи друзья работают просто отлично.
Стивен Лу

17

Если вы хотите быть более эффективным, тогда да, вы правы в том, что psможете фильтровать только рассматриваемый процесс (и это будет более правильно, если вы не рискуете подобрать команды, в названии которых указан номер вашего процесса). ). Не только это, но и можно сказать не генерировать заголовок (опцию h), исключая tailпроцесс, а отображать только TTYполе (опцию o tty), исключая awkпроцесс.

Итак, вот ваша сокращенная команда:

ps hotty $$

10

Другие способы сделать это:

readlink /dev/fd/0     #or 1 or 2 
readlink /proc/self/fd/0 #or 1 or 2
readlink -f /dev/stdin #or stdout or stderr; f to resolve recursively
#etc.

(Если вы находитесь в оболочке, чьи stdin, stdout и stderr не подключены к управляющему терминалу, вы можете получить дескриптор файла к управляющему терминалу, открыв /dev/tty:

( { readlink /dev/fd/0; } </dev/tty; ) </dev/null  >output 2>&1

)

Или с ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$

2
(1) Я рад, что вы поняли, что текущий / управляющий tty процесса не связан ни с одним файловым дескриптором и не гарантированно будет открыт на любом fd. Но вы пробовали команду, которую вы предлагаете в качестве обходного пути для этого непредвиденного обстоятельства? Когда я пытаюсь это сделать, все, что я получаю, это /dev/ttyне контрольный tty (как сообщает ps). (2) Я считаю, что { readlink /dev/fd/0; } < /dev/ttyэто (и всегда будет) эквивалентно readlink /dev/fd/0 < /dev/tty- верите ли вы иначе? Если да, можете ли вы оправдать это? (3) Вторая точка с запятой в вашей команде (та, что после /dev/tty) не нужна.
Скотт

6

Просто для полноты, в то время как другие упомянутые команды ps работают в Linux ps -p $$ -o tty=(как упоминается @ 1_CR) являются наиболее переносимыми для всех современных систем Unix, поскольку в них используются только параметры, определенные в стандарте Unix .


2

В интерактивной оболочке wдля этого можно использовать команду. В приведенном ниже примере wсообщается, что запускается конкретным пользователем, и, конечно, он показывает TTY, где выполняется эта команда.

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
xieerqi  :0       :0               11:15   ?xdm?   1:47   0.34s init --user
xieerqi  pts/0    :0               11:18   23.00s  0.05s  0.05s /bin/mksh
xieerqi  pts/10   :0               11:20    0.00s  0.03s  0.01s w
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.