Como obter o tty no qual o bash está rodando?

21

No segundo método proposto por esta página , obtém-se o tty em que o bash está sendo executado com o comando:

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

Eu pensei em mim mesmo que certamente isso é um pouco preguiçoso, listando todos os processos em execução apenas para extrair um deles. Não seria mais eficiente (também estou perguntando se isso introduziria efeitos indesejados):

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

FYI, me deparei com esse problema porque às vezes o primeiro comando realmente produzia duas (ou mais) linhas. Isso aconteceria aleatoriamente, quando haveria outro processo em execução com um PID que contenha $$ como substring. Na segunda abordagem, estou evitando esses casos, solicitando ao PID que sei que quero.

    
por Sheljohn 16.03.2016 / 19:45

5 respostas

39

Basta digitar tty :

$ tty 
/dev/pts/20

Muito simples e óbvio para ser verdade:)

Editar: O primeiro retorna também o pty do processo que está executando grep , como você pode perceber:

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

portanto, você precisaria filtrar o grep para obter apenas um resultado, o que está ficando feio:

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

ou usando

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

(uma variante mais sã)

    
por 16.03.2016 / 19:52
14

Se você quer ser mais eficiente, então sim, você está certo que ps pode filtrar apenas o processo em questão (e será mais correto, não correndo o risco de pegar comandos que por acaso tenham seu número de processo em seus nomes). Não apenas isso, mas pode ser dito para não gerar o cabeçalho (opção h ), eliminando o processo tail e exibir apenas o campo TTY (opção o tty ), eliminando o processo awk .

Então aqui está o seu comando reduzido:

ps hotty $$
    
por 17.03.2016 / 09:36
9

Outras maneiras de fazer isso:

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.

( Se você está em um shell cujo stdin, stdout e stderr não estão conectados ao seu terminal de controle, você pode obter um filedescriptor para o terminal de controle abrindo /dev/tty :

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

Ou com ps :

ps h -o tty -p $$ #no header (h); print tty column; for pid $$
    
por 16.03.2016 / 21:49
4

Apenas para completar, enquanto os outros comandos ps mencionados trabalham no Linux, ps -p $$ -o tty= (como mencionado por @ 1_CR) é o mais portátil para todos os sistemas Unix modernos, já que ele usa apenas as opções definidas no Unix Standard .

    
por 17.03.2016 / 13:51
2

No shell interativo, pode-se usar o comando w para isso. No exemplo abaixo, w informa a si mesmo sendo executado por um usuário específico e, claro, mostra TTY onde esse comando está sendo executado.

$ 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
    
por 17.03.2016 / 18:23

Tags