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 de manière aléatoire, lorsqu'un autre processus s'exécuterait avec un PID qui contient $$
une sous-chaîne. Dans la deuxième approche, j'évite de tels cas en demandant le PID que je sais que je veux.
tty
commande dans votre session bash. Si vous insistez pour utiliserps
-ps -p $$ -o tty=
Réponses:
En tapant simplement
tty
:Trop simple et évident pour être vrai :)
Edit: Le premier vous renvoie également
pty
le processus en cours,grep
comme vous pouvez le constater:par conséquent, vous devrez filtrer le grep pour obtenir un seul résultat, qui devient moche:
ou en utilisant
(une variante plus saine d'esprit)
la source
tty | sed -e "s:/dev/::"
). Mais je pense que la deuxième solution suggérée sur cette page est non seulement inefficace, mais aussi fausse! Je vais utilisertty
et arrêter de me plaindre cependant. :)pty
le processus en cours,grep
comme vous pouvez le constater.grep
si vous utilisezawk
. par exempleps ax | awk "/^$$/ {print \$2}"
- notez l'utilisation des guillemets doubles plutôt que des guillemets simples et des caractères d'échappement\$2
. Mais, comme vous le dites, l'utilisationtty
est la bonne solution.awk -vpid=$$ '$1 == pid {print $2}'
tty
dans node.js ne fonctionne pas du tout, tandis queps
et les amis fonctionnent très bien.Si vous voulez être plus efficace, alors oui, vous avez raison, vous
ps
pouvez filtrer uniquement le processus en question (et ce sera plus correct, sans courir le risque de prendre des commandes qui ont 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 (optionh
), d'éliminer letail
processus et d'afficher uniquement leTTY
champ (optiono tty
), éliminant leawk
processus.Voici donc votre commande réduite:
la source
Autres façons de procéder:
(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
:)
Ou avec
ps
:la source
/dev/tty
, et non le tty de contrôle (tel que rapporté parps
). (2) Je crois que{ readlink /dev/fd/0; } < /dev/tty
c'est (et sera toujours) équivalent àreadlink /dev/fd/0 < /dev/tty
- croyez-vous le contraire? Si oui, pouvez-vous le justifier? (3) Le deuxième point-virgule de votre commande (celui qui suit/dev/tty
) n'est pas nécessaire.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 la plus portable pour tous les systèmes Unix modernes, car elle utilise uniquement les options définies dans la norme Unix .la source
Dans le shell interactif, on pourrait utiliser la
w
commande pour cela. Dans l'exemple ci-dessous,w
signale lui-même être exécuté par un utilisateur spécifique, et bien sûr, il montre TTY où cette commande est exécutée.la source