No segundo método proposto por esta página , obtém-se o tty no qual o bash está sendo executado com o comando:
ps ax | grep $$ | awk '{ print $2 }'
Eu pensei comigo 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 apresentaria efeitos indesejados):
ps -p $$ | tail -n 1 | awk '{ print $2 }'
Para sua informação, deparei-me com esse problema porque, às vezes, o primeiro comando produzia duas (ou mais) linhas. Isso aconteceria aleatoriamente, quando houvesse outro processo em execução com um PID que contenha $$
como substring. Na segunda abordagem, evito esses casos solicitando o PID que sei que quero.
tty
comando na sua sessão do bash. Se você insistir em usarps
-ps -p $$ -o tty=
Respostas:
Simplesmente digitando
tty
:Simples demais e óbvio para ser verdade :)
Editar: O primeiro retorna também
pty
o processo em execução,grep
como você pode perceber:portanto, você precisaria filtrar o grep para obter apenas um resultado, o que está ficando feio:
ou usando
(uma variante mais sã)
fonte
tty | sed -e "s:/dev/::"
). Mas acho que a segunda solução sugerida nessa página não é apenas ineficiente, mas também errada! Vou usartty
e parar de reclamar. :)pty
o processo em execução,grep
como você pode notar.grep
se estiver usandoawk
. por exemplops ax | awk "/^$$/ {print \$2}"
- observe o uso de aspas duplas em vez de aspas simples e de escape\$2
. Mas, como você diz, usartty
é a solução correta.awk -vpid=$$ '$1 == pid {print $2}'
tty
no node.js não funciona, enquanto osps
amigos funcionam bem.Se você quiser ser mais eficiente, 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 têm o número do processo em seus nomes. ) Não apenas isso, mas pode ser dito para não gerar o cabeçalho (opçãoh
), eliminando otail
processo, e exibir apenas oTTY
campo (opçãoo tty
), eliminando oawk
processo.Então aqui está o seu comando reduzido:
fonte
Outras maneiras de fazer isso:
(Se você estiver em um shell cujo stdin, stdout e stderr não estão conectados ao seu terminal de controle, é possível obter um filedescriptor no terminal de controle abrindo
/dev/tty
:)
Ou com
ps
:fonte
/dev/tty
, e não o controle tty (conforme relatado porps
). (2) Eu acredito que{ readlink /dev/fd/0; } < /dev/tty
é (e sempre será) equivalente areadlink /dev/fd/0 < /dev/tty
- você acredita de outra forma? Se sim, você pode justificar isso? (3) O segundo ponto e vírgula em seu comando (o seguinte/dev/tty
) é desnecessário.Apenas para completar, enquanto os outros comandos ps mencionados funcionam no Linux
ps -p $$ -o tty=
(como mencionado por @ 1_CR) é o mais portátil para todos os sistemas Unix modernos, pois usa apenas as opções definidas no Padrão Unix .fonte
No shell interativo, pode-se usar o
w
comando para isso. No exemplo abaixo, ow
relatório é executado por um usuário específico e, é claro, mostra TTY onde esse comando está sendo executado.fonte