Eine weitere Möglichkeit ist die Verwendung commandherabzuzustufen execvon 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 commanddas 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 Xdie tty bestimmt ist - die Konsole. Wenn Sie eine XApp aus einer X .desktopDatei ausführen, wird die von ihr erzeugte Ausgabe an Xdas virtuelle Terminal weitergeleitet - unabhängig davon, von welchem Zeitpunkt aus Sie sie gestartet Xhaben. 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 XorgVersion 1.16 implementiert wurde und die es ermöglicht, unter einer systemdBenutzersitzung 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 appKonsolenausgabe an /dev/tty$((1+$XDG_VTNR))statt an meine xtermPty 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/consoleist 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 printkdie im Grunde genommen gedruckt wird, /dev/consoleund 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 xtermFenster geöffnet lassen, die Ausgabe ttyvon dort in einer Umgebungsvariablen speichern und diesen Wert als Ziel für guidie 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 bashGeschichte machen kann, wenn man interessiert ist.