Eine weitere Möglichkeit ist die Verwendung command
herabzuzustufen exec
von einem speziellen builtin zu einer einfachen alten builtin wie:
alias shh='command exec >/dev/null 2>&1'
Jetzt können Sie also Folgendes tun:
(shh; call some process &)
Ich habe gerade bemerkt, dass command
das nicht funktioniert zsh
(wie es in den meisten anderen Shells der Fall zu sein scheint) , aber wo es nicht funktioniert, können Sie stattdessen Folgendes tun:
alias shh='eval "exec >/dev/null 2>&1"'
... die überall funktionieren sollte.
In der Tat könnten Sie sogar tun:
alias shh='command exec >"${O:-/dev/null}" 2>&1'
Sie könnten also Folgendes tun:
O=./logfile; (shh;echo can anyone hear &)
O=; (shh; echo this\? &)
cat ./logfile
AUSGABE
can anyone hear
Nach einer Kommentardiskussion mit @ vinc17 ist anzumerken, dass fast die gesamte Konsolenausgabe einer GUI-App im Allgemeinen für X
die tty bestimmt ist - die Konsole. Wenn Sie eine X
App aus einer X
.desktop
Datei ausführen, wird die von ihr erzeugte Ausgabe an X
das virtuelle Terminal weitergeleitet - unabhängig davon, von welchem Zeitpunkt aus Sie sie gestartet X
haben. Ich kann diese tty Nummer mit adressieren $XDG_VTNR
.
Seltsamerweise - und vielleicht, weil ich gerade angefangen habe zu benutzen startx
- kann ich nicht länger nur schreiben /dev/tty$XDG_VTNR
. Dies kann auch (wie ich es für wahrscheinlicher halte) mit der jüngsten und drastischen Änderung zu tun haben, die mit Xorg
Version 1.16 implementiert wurde und die es ermöglicht, unter einer systemd
Benutzersitzung ausgeführt zu werden, anstatt Root- Berechtigungen zu erfordern .
Trotzdem kann ich:
alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'
(gui; some x app &)
Jetzt wird die gesamte some x app
Konsolenausgabe an /dev/tty$((1+$XDG_VTNR))
statt an meine xterm
Pty weitergeleitet. Ich kann die letzte Seite davon jederzeit wie folgt abrufen:
fmt </dev/vcs$((1+$XDG_VTNR))
Es wird wahrscheinlich empfohlen, ein virtuelles Terminal zu verwenden, um die Ausgabe trotzdem zu protokollieren. /dev/console
ist in der Regel bereits dafür reserviert, obwohl Sie es vielleicht vorziehen, nicht das zu tun chown
, was Sie wahrscheinlich benötigen, um munter darauf zu schreiben. Möglicherweise verfügen Sie über eine Funktion, mit der Sie eine Funktion ausführen können, für printk
die im Grunde genommen gedruckt wird, /dev/console
und die Sie möglicherweise auf diese Weise verwenden können.
Ein anderer Weg, dies zu tun, wäre, ein Pty solchen Zwecken zu widmen . Sie können beispielsweise ein xterm
Fenster geöffnet lassen, die Ausgabe tty
von dort in einer Umgebungsvariablen speichern und diesen Wert als Ziel für gui
die Ausgabe verwenden. Auf diese Weise würden alle Protokolle in ein separates Protokollfenster geleitet, in dem Sie bei Bedarf einen Bildlauf durchführen können.
Ich habe einmal eine Antwort darüber geschrieben, wie man etwas Ähnliches mit der bash
Geschichte machen kann, wenn man interessiert ist.