web-dev-qa-db-fra.com

Comment obtenir le tty dans lequel bash s'exécute?

Dans la deuxième méthode proposée par cette page , on obtient le tty dans lequel bash est exécuté avec la commande:

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

Je me suis dit que c'était sûrement un peu paresseux, listant tous les processus en cours uniquement pour en extraire un. Ne serait-il pas plus efficace (je demande également si cela introduirait des effets indésirables) de faire:

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

Pour info, je suis tombé sur ce problème car parfois la première commande produisait en fait deux (ou plus) lignes. Cela se produirait au hasard, lorsqu'un autre processus s'exécuterait avec un PID contenant $$ comme sous-chaîne. Dans la deuxième approche, j'évite de tels cas en demandant le PID que je sais que je veux.

30
Jonathan H

Il suffit de taper tty:

$ tty 
/dev/pts/20

Trop simple et évident pour être vrai :)

Edit: Le premier vous renvoie également le pty du processus exécutant grep comme vous pouvez le constater:

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

par conséquent, vous devrez filtrer le grep pour obtenir un seul résultat, qui devient laid:

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

ou en utilisant

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

(une variante plus saine d'esprit)

51
Jakuje

Si vous voulez être plus efficace, alors oui, vous avez raison: ps peut filtrer uniquement sur le processus en question (et ce sera plus correct, sans courir le risque de prendre des commandes qui se trouvent avoir votre numéro de processus dans leurs noms). Non seulement cela, mais on peut lui dire de ne pas générer l'en-tête (option h), éliminant le processus tail, et d'afficher uniquement le champ TTY (option o tty), éliminant le processus awk.

Voici donc votre commande réduite:

ps hotty $$
17
Toby Speight

Autres façons de procéder:

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 vous êtes dans un Shell dont stdin, stdout et stderr ne sont pas connectés à son terminal de contrôle, vous pouvez obtenir un descripteur de fichier sur le terminal de contrôle en ouvrant /dev/tty:

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

)

Ou avec ps:

ps h -o tty -p $$ #no header (h); print tty column; for pid $$
10
PSkocik

Juste pour être complet, alors que les autres commandes ps mentionnées fonctionnent sous Linux, ps -p $$ -o tty= (comme mentionné par @ 1_CR) est le plus portable pour tous les systèmes Unix modernes, car il utilise uniquement les options définies dans nix Standard .

8
Random832

Dans le shell interactif, on pourrait utiliser la commande w pour cela. Dans l'exemple ci-dessous, w se signale comme étant exécuté par un utilisateur spécifique, et bien sûr, il indique TTY où cette commande est exécutée.

$ 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
2