¿Cómo obtener el tty en el que se ejecuta bash?

25

En el segundo método propuesto por esta página , se obtiene el tty en el que se ejecuta bash con el comando:

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

Pensé para mí mismo que seguramente esto es un poco vago, enumerando todos los procesos en ejecución solo para extraer uno de ellos. ¿No sería más eficiente (también pregunto si esto introduciría efectos no deseados) para hacer:

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

Para su información, me encontré con este problema porque a veces el primer comando en realidad produciría dos (o más) líneas. Esto sucedería al azar, cuando habría otro proceso ejecutándose con un PID que contiene $$como una subcadena. En el segundo enfoque, evito tales casos al solicitar el PID que sé que quiero.

Sheljohn
fuente
66
bueno, lo más eficiente de todo sería ejecutar el ttycomando dentro de su sesión bash. Si insiste en usar ps-ps -p $$ -o tty=
iruvar

Respuestas:

47

Simplemente escribiendo tty:

$ tty 
/dev/pts/20

Demasiado simple y obvio para ser verdad :)

Editar: el primero le devuelve también ptyel proceso en ejecución, grepcomo puede notar:

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

por lo tanto, necesitaría filtrar el grep para obtener solo un resultado, que se está poniendo feo:

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

o usando

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

(una variante más sensata)

Jakuje
fuente
Sí, esa es la primera solución sugerida (en realidad lo es tty | sed -e "s:/dev/::"). Pero creo que la segunda solución sugerida en esa página no solo es ineficiente, ¡sino también incorrecta! Sin ttyembargo, usaré y dejaré de quejarme. :)
Sheljohn
El primero le devuelve también ptyel proceso en ejecución grepcomo puede notar.
Jakuje
2
No necesitas grepsi lo estás usando awk. por ejemplo ps ax | awk "/^$$/ {print \$2}", tenga en cuenta el uso de comillas dobles en lugar de comillas simples y el escape \$2. Pero, como dices, usar ttyes la solución correcta.
cas
Hacer greps así puede dar lugar a falsas coincidencias, por ejemplo, si su PID es 10 y también hay un PID 103. Usoawk -vpid=$$ '$1 == pid {print $2}'
Barmar
Solo estoy señalando aquí que el desove ttyen node.js no funciona en absoluto, mientras que los psamigos funcionan bien.
Steven Lu
17

Si desea ser más eficiente, entonces sí, tiene razón y pspuede filtrar solo el proceso en cuestión (y será más correcto, no correrá el riesgo de recoger comandos que tienen su número de proceso en sus nombres) ) No solo eso, sino que se le puede decir que no genere el encabezado (opción h), eliminando el tailproceso, y que muestre solo el TTYcampo (opción o tty), eliminando el awkproceso.

Así que aquí está tu comando reducido:

ps hotty $$
Toby Speight
fuente
10

Otras formas de hacerlo:

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.

(Si está en un shell cuyo stdin, stdout y stderr no están conectados a su terminal de control, puede obtener un descriptor de archivo al terminal de control abriendo /dev/tty:

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

)

O con ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$
PSkocik
fuente
2
(1) Me alegro de que te hayas dado cuenta de que el tty actual / controlador de un proceso no está asociado con ningún descriptor de archivo, y no se garantiza que esté abierto en ningún archivo. Pero, ¿probaste el comando que ofreces como solución para esa contingencia? Cuando lo intento, todo lo que obtengo es /dev/tty, y no el tty controlador (según lo informado por ps). (2) Creo que { readlink /dev/fd/0; } < /dev/ttyes (y siempre será) equivalente a readlink /dev/fd/0 < /dev/tty: ¿cree usted lo contrario? Si es así, ¿puedes justificarlo? (3) El segundo punto y coma en su comando (el siguiente /dev/tty) es innecesario.
Scott
6

Solo para completar, mientras que los otros comandos ps mencionados funcionan en Linux, ps -p $$ -o tty=(como se menciona en @ 1_CR) es el más portátil para todos los sistemas Unix modernos, ya que utiliza solo las opciones definidas en el Estándar Unix .

Aleatorio832
fuente
2

En el shell interactivo, uno podría usar el wcomando para eso. En el siguiente ejemplo, se winforma que un usuario específico lo ejecuta y, por supuesto, muestra a TTY dónde se ejecuta ese comando.

$ 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
Sergiy Kolodyazhnyy
fuente