Wie bekomme ich das tty, in dem bash läuft?

24

In der zweiten von dieser Seite vorgeschlagenen Methode erhält man das tty, in dem die Bash ausgeführt wird, mit dem Befehl:

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

Ich dachte mir, dass dies sicherlich ein bisschen faul ist, alle laufenden Prozesse aufzulisten, 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 geschieht zufällig, wenn ein anderer Prozess mit einer PID ausgeführt wird, die $$eine 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.

Sheljohn
quelle
6
Am effizientesten wäre es, den ttyBefehl in Ihrer Bash-Sitzung auszuführen . Wenn Sie darauf bestehen, ps-ps -p $$ -o tty=
iruvar

Antworten:

46

Einfach durch Tippen tty:

$ tty 
/dev/pts/20

Zu einfach und offensichtlich, um wahr zu sein :)

Bearbeiten: Der erste gibt Ihnen auch den ptylaufenden Prozess zurück, grepwie 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 das 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)

Jakuje
quelle
Ja, das ist tatsächlich die erste vorgeschlagene Lösung (tatsächlich ist es dies tty | sed -e "s:/dev/::"). Aber ich denke, die zweite vorgeschlagene Lösung auf dieser Seite ist nicht nur ineffizient, sondern auch falsch! Ich benutze es ttyund höre auf mich zu beschweren. :)
Sheljohn
Der erste gibt Ihnen auch ptyden Prozess zurück, der ausgeführt wird, grepwie Sie feststellen können.
Jakuje
2
Sie brauchen nicht, grepwenn Sie verwenden awk. ZB ps ax | awk "/^$$/ {print \$2}"- Beachten Sie die Verwendung von doppelten Anführungszeichen anstelle von einfachen Anführungszeichen und von Escape-Zeichen \$2. Aber wie Sie sagen, ttyist die Verwendung die richtige Lösung.
cas
Solches Greifen kann zu falschen Übereinstimmungen führen, z. B. wenn Ihre PID 10 ist und es auch eine PID 103 gibt. Verwenden Sieawk -vpid=$$ '$1 == pid {print $2}'
Barmar
Ich stelle hier nur fest, dass das Laichen ttyin node.js überhaupt nicht funktioniert, während psund Freunde gut funktionieren.
Steven Lu
17

Wenn Sie effizienter sein möchten, dann haben Sie Recht, dass Sie psnur nach dem fraglichen Prozess filtern können (und es ist korrekter, wenn Sie nicht das Risiko eingehen, Befehle zu übernehmen, die zufällig Ihre Prozessnummer im Namen haben ). Nicht nur das, sondern es kann auch angewiesen werden, den Header (Option h) nicht zu generieren , um den tailProzess zu eliminieren , und nur das TTYFeld (Option o tty) anzuzeigen , um den awkProzess zu eliminieren .

Also hier ist dein reduzierter Befehl:

ps hotty $$
Toby Speight
quelle
10

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 Filedescriptor für das steuernde Terminal erstellen, indem Sie Folgendes öffnen /dev/tty:

( { 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 $$
PSkocik
quelle
2
(1) Ich bin froh, dass Sie erkannt haben, dass die aktuelle / steuernde Tty eines Prozesses keinem Dateideskriptor zugeordnet ist und nicht garantiert auf einem fd geöffnet ist. Aber haben Sie den Befehl, den Sie als Problemumgehung für diese Eventualität anbieten, ausprobiert? Wenn ich es versuche, bekomme ich nur /dev/ttyund nicht das Kontroll-Tty (wie von gemeldet ps). (2) Ich glaube, das { readlink /dev/fd/0; } < /dev/ttyist (und bleibt) gleichbedeutend mit readlink /dev/fd/0 < /dev/tty- glauben Sie etwas anderes? Wenn ja, können Sie das rechtfertigen? (3) Das zweite Semikolon in Ihrem Befehl (das nachstehende /dev/tty) ist nicht erforderlich.
Scott
6

Der Vollständigkeit ps -p $$ -o tty=halber ist die Verwendung der anderen genannten ps-Befehle unter Linux (wie von @ 1_CR erwähnt) für alle modernen Unix-Systeme am portabelsten, da nur die im Unix-Standard definierten Optionen verwendet werden .

Random832
quelle
2

In der interaktiven Shell könnte man dafür einen wBefehl verwenden. Im folgenden Beispiel wird angezeigt, wdass der Befehl von einem bestimmten Benutzer ausgeführt wird, und es wird TTY angezeigt, wo der Befehl ausgeführt wird.

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