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.
tty
Befehl in Ihrer Bash-Sitzung auszuführen . Wenn Sie darauf bestehen,ps
-ps -p $$ -o tty=
Antworten:
Einfach durch Tippen
tty
:Zu einfach und offensichtlich, um wahr zu sein :)
Bearbeiten: Der erste gibt Ihnen auch den
pty
laufenden Prozess zurück,grep
wie Sie feststellen können:Daher müssten Sie das grep herausfiltern, um nur ein Ergebnis zu erhalten, das hässlich wird:
oder mit
(eine vernünftigere Variante)
quelle
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 estty
und höre auf mich zu beschweren. :)pty
den Prozess zurück, der ausgeführt wird,grep
wie Sie feststellen können.grep
wenn Sie verwendenawk
. ZBps 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,tty
ist die Verwendung die richtige Lösung.awk -vpid=$$ '$1 == pid {print $2}'
tty
in node.js überhaupt nicht funktioniert, währendps
und Freunde gut funktionieren.Wenn Sie effizienter sein möchten, dann haben Sie Recht, dass Sie
ps
nur 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 (Optionh
) nicht zu generieren , um dentail
Prozess zu eliminieren , und nur dasTTY
Feld (Optiono tty
) anzuzeigen , um denawk
Prozess zu eliminieren .Also hier ist dein reduzierter Befehl:
quelle
Andere Möglichkeiten:
(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
:)
Oder mit
ps
:quelle
/dev/tty
und nicht das Kontroll-Tty (wie von gemeldetps
). (2) Ich glaube, das{ readlink /dev/fd/0; } < /dev/tty
ist (und bleibt) gleichbedeutend mitreadlink /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.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 .quelle
In der interaktiven Shell könnte man dafür einen
w
Befehl verwenden. Im folgenden Beispiel wird angezeigt,w
dass der Befehl von einem bestimmten Benutzer ausgeführt wird, und es wird TTY angezeigt, wo der Befehl ausgeführt wird.quelle