it-swarm.com.de

Wie bekomme ich die tty, in der Bash läuft?

Bei der zweiten von dieser Seite vorgeschlagenen Methode erhält man die tty, in der bash ausgeführt wird, mit dem folgenden Befehl:

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

Ich dachte mir, dass dies sicherlich ein bisschen faul ist und alle laufenden Prozesse auflistet, nur um einen von ihnen zu extrahieren. Wäre es nicht effizienter (ich frage auch, ob dies unerwünschte Effekte hervorrufen würde):

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

Zu Ihrer Information, ich bin auf dieses Problem gestoßen, weil manchmal der erste Befehl tatsächlich zwei (oder mehr) Zeilen ergab. Dies würde zufällig passieren, wenn ein anderer Prozess mit einer PID ausgeführt würde, die $$ Als Teilzeichenfolge enthält. Beim zweiten Ansatz vermeide ich solche Fälle, indem ich die PID anfordere, von der ich weiß, dass ich sie möchte.

30
Jonathan H

Einfach durch Eingabe von tty:

$ tty 
/dev/pts/20

Zu einfach und offensichtlich um wahr zu sein :)

Edit : Der erste gibt Ihnen auch das pty des Prozesses zurück, auf dem grep ausgeführt wird, wie Sie feststellen können:

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

daher müssten Sie den Grep herausfiltern, um nur ein Ergebnis zu erhalten, das hässlich wird:

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

oder mit

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

(eine vernünftigere Variante)

51
Jakuje

Wenn Sie effizienter sein möchten, dann haben Sie Recht, dass ps nur nach dem betreffenden Prozess filtern kann (und dies ist korrekter, ohne das Risiko einzugehen, dass Befehle empfangen werden, die zufällig vorhanden sind Ihre Prozessnummer in ihren Namen). Darüber hinaus kann angewiesen werden, den Header nicht zu generieren (Option h), den Prozess tail zu eliminieren und nur das Feld TTY anzuzeigen (Option o tty), Wodurch der Prozess awk eliminiert wird.

Also hier ist dein reduzierter Befehl:

ps hotty $$
17
Toby Speight

Andere Möglichkeiten:

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.

(Wenn Sie sich in einer Shell befinden, deren stdin, stdout und stderr nicht mit dem steuernden Terminal verbunden sind, können Sie einen Dateideskriptor an das steuernde Terminal senden, indem Sie /dev/tty Öffnen:

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

)

Oder mit ps:

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

Nur der Vollständigkeit halber, während die anderen genannten ps-Befehle unter Linux funktionieren, ps -p $$ -o tty= (wie von @ 1_CR erwähnt) ist für alle modernen Unix-Systeme am portabelsten, da nur Optionen verwendet werden, die in nix Standard definiert sind.

8
Random832

In der interaktiven Shell könnte man dafür den Befehl w verwenden. Im folgenden Beispiel meldet w, dass er von einem bestimmten Benutzer ausgeführt wird, und zeigt TTY natürlich an, wo dieser Befehl ausgeführt wird.

$ w
 11:20:08 up 5 min,  3 users,  load average: 0.34, 0.39, 0.20
USER     TTY      FROM             [email protected]   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