Во втором методе, предложенном на этой странице , вы получите tty, в котором bash запускается с помощью команды:
ps ax | grep $$ | awk '{ print $2 }'
Я подумал, что это немного лениво, перечисляя все запущенные процессы только для извлечения одного из них. Разве это не было бы более эффективно (я также спрашиваю, привнесет ли это нежелательные эффекты):
ps -p $$ | tail -n 1 | awk '{ print $2 }'
К вашему сведению, я сталкивался с этой проблемой, потому что иногда первая команда фактически выдает две (или более) строки. Это произойдет случайным образом, когда будет запущен другой процесс с PID, который содержит $$
в качестве подстроки. Во втором подходе я избегаю таких случаев, запрашивая PID, который, как я знаю, я хочу.
tty
команды в вашей сессии bash. Если вы настаиваете на использованииps
-ps -p $$ -o tty=
Ответы:
Просто набрав
tty
:Слишком просто и очевидно, чтобы быть правдой :)
Редактировать: первый возвращает вам также
pty
процесс, запущенный,grep
как вы можете заметить:поэтому вам нужно отфильтровать grep, чтобы получить только один результат, который выглядит ужасно:
или используя
(более вменяемый вариант)
источник
tty | sed -e "s:/dev/::"
). Но я думаю, что второе предлагаемое решение на этой странице не только неэффективно, но и неправильно! Я используюtty
и перестану жаловаться, хотя. :)pty
о том, что процесс запущен,grep
как вы можете заметить.grep
если вы используетеawk
. например,ps ax | awk "/^$$/ {print \$2}"
обратите внимание на использование двойных кавычек, а не одиночных кавычек и экранированных\$2
. Но, как вы говорите, использованиеtty
является правильным решением.awk -vpid=$$ '$1 == pid {print $2}'
tty
в node.js не работает вообще, в то время какps
и друзья работают просто отлично.Если вы хотите быть более эффективным, тогда да, вы правы в том, что
ps
можете фильтровать только рассматриваемый процесс (и это будет более правильно, если вы не рискуете подобрать команды, в названии которых указан номер вашего процесса). ). Не только это, но и можно сказать не генерировать заголовок (опциюh
), исключаяtail
процесс, а отображать толькоTTY
поле (опциюo tty
), исключаяawk
процесс.Итак, вот ваша сокращенная команда:
источник
Другие способы сделать это:
(Если вы находитесь в оболочке, чьи stdin, stdout и stderr не подключены к управляющему терминалу, вы можете получить дескриптор файла к управляющему терминалу, открыв
/dev/tty
:)
Или с
ps
:источник
/dev/tty
не контрольный tty (как сообщаетps
). (2) Я считаю, что{ readlink /dev/fd/0; } < /dev/tty
это (и всегда будет) эквивалентноreadlink /dev/fd/0 < /dev/tty
- верите ли вы иначе? Если да, можете ли вы оправдать это? (3) Вторая точка с запятой в вашей команде (та, что после/dev/tty
) не нужна.Просто для полноты, в то время как другие упомянутые команды ps работают в Linux
ps -p $$ -o tty=
(как упоминается @ 1_CR) являются наиболее переносимыми для всех современных систем Unix, поскольку в них используются только параметры, определенные в стандарте Unix .источник
В интерактивной оболочке
w
для этого можно использовать команду. В приведенном ниже примереw
сообщается, что запускается конкретным пользователем, и, конечно, он показывает TTY, где выполняется эта команда.источник