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.
tty
comando dentro de su sesión bash. Si insiste en usarps
-ps -p $$ -o tty=
Respuestas:
Simplemente escribiendo
tty
:Demasiado simple y obvio para ser verdad :)
Editar: el primero le devuelve también
pty
el proceso en ejecución,grep
como puede notar:por lo tanto, necesitaría filtrar el grep para obtener solo un resultado, que se está poniendo feo:
o usando
(una variante más sensata)
fuente
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! Sintty
embargo, usaré y dejaré de quejarme. :)pty
el proceso en ejecucióngrep
como puede notar.grep
si lo estás usandoawk
. por ejemplops ax | awk "/^$$/ {print \$2}"
, tenga en cuenta el uso de comillas dobles en lugar de comillas simples y el escape\$2
. Pero, como dices, usartty
es la solución correcta.awk -vpid=$$ '$1 == pid {print $2}'
tty
en node.js no funciona en absoluto, mientras que losps
amigos funcionan bien.Si desea ser más eficiente, entonces sí, tiene razón y
ps
puede 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ónh
), eliminando eltail
proceso, y que muestre solo elTTY
campo (opcióno tty
), eliminando elawk
proceso.Así que aquí está tu comando reducido:
fuente
Otras formas de hacerlo:
(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
:)
O con
ps
:fuente
/dev/tty
, y no el tty controlador (según lo informado porps
). (2) Creo que{ readlink /dev/fd/0; } < /dev/tty
es (y siempre será) equivalente areadlink /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.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 .fuente
En el shell interactivo, uno podría usar el
w
comando para eso. En el siguiente ejemplo, sew
informa que un usuario específico lo ejecuta y, por supuesto, muestra a TTY dónde se ejecuta ese comando.fuente