Ich starte GUI-Anwendungen lieber über ein Terminalfenster als über einen grafischen Desktop. Ein häufiges Ärgernis ist, dass die Entwickler diese Art der Verwendung oft nicht erwartet haben, sodass die App viele nutzlose, kryptische oder nicht informative Nachrichten an stdout oder stderr druckt. Weitere Unordnung auf dem Terminal tritt auf, weil das Ausführen des Programms im Hintergrund mit einem & Berichte über die Erstellung und Beendigung des Jobs generiert.
Was ist eine Problemumgehung für diese Probleme, die Befehlszeilenargumente akzeptieren und die automatische Vervollständigung verarbeiten?
Verwandte Themen: /programming/7131670/make-bash-alias-that-takes-parameter
quelle
$DISPLAY
nicht gesetzt ist (zB wenn der Benutzer ein-X
für ssh vergessen hat ) oder ein X-Berechtigungsproblem wie hier: unix.stackexchange.com/questions/108679/…"$@" 2>&1 | { quit=$(($(date +%s)+5)); while read line && [ $(date +%s) -lt $quit ]; do printf "[%s] %s\n" "$(date +%T)" "$line"; done; } | head -n 10 &
(Der wichtigste Punkt war die Idee, nicht die tatsächliche Implementierung).Diese Antwort ist für die Bash. Als Beispiel hier ist, was ich in meinem .bashrc mache, um einen Bequemlichkeitsbefehl
ev
zum Starten des PDF-Viewers Evince zu erstellen .Die erste Zeile definiert eine Funktion
ev
. Der Name einer Funktion wird erkannt, wenn Sie sie in der Befehlszeile wie folgt verwenden:(Dies ist ein anderer Mechanismus als Aliase und hat eine niedrigere Priorität.) Die Ausgabe von Evince an stdin und stdout wird an das Bitbucket (/ dev / null) gesendet. Das kaufmännische Und stellt den Job in den Hintergrund. Wenn Sie den Befehl in Klammern setzen, wird er in einer Subshell ausgeführt, sodass keine Nachrichten über die Erstellung oder den Abschluss des Hintergrundjobs gedruckt werden.
In der zweiten Zeile von .bashrc wird die vollständige Funktion von bash verwendet, um bash mitzuteilen, dass das Argument des Befehls ev voraussichtlich eine Datei mit der Erweiterung pdf ist. Dies bedeutet, dass ich, wenn ich auch Dateien foo.tex, foo.aux usw. in meinem Verzeichnis habe,
ev foo
die Tabulatortaste eingeben und drücken kann und bash weiß, dass der Dateiname als foo.pdf vervollständigt wird.quelle
ev() (evince "$@" >&2 &) 2>/dev/null
ev() (evince "$@" &>/dev/null $)
&
.Eine weitere Möglichkeit ist die Verwendung
command
herabzuzustufenexec
von einem speziellen builtin zu einer einfachen alten builtin wie:Jetzt können Sie also Folgendes tun:
Ich habe gerade bemerkt, dass
command
das nicht funktioniertzsh
(wie es in den meisten anderen Shells der Fall zu sein scheint) , aber wo es nicht funktioniert, können Sie stattdessen Folgendes tun:... die überall funktionieren sollte.
In der Tat könnten Sie sogar tun:
Sie könnten also Folgendes tun:
AUSGABE
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 eineX
App aus einerX
.desktop
Datei ausführen, wird die von ihr erzeugte Ausgabe anX
das virtuelle Terminal weitergeleitet - unabhängig davon, von welchem Zeitpunkt aus Sie sie gestartetX
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 mitXorg
Version 1.16 implementiert wurde und die es ermöglicht, unter einersystemd
Benutzersitzung ausgeführt zu werden, anstatt Root- Berechtigungen zu erfordern .Trotzdem kann ich:
Jetzt wird die gesamte
some x app
Konsolenausgabe an/dev/tty$((1+$XDG_VTNR))
statt an meinexterm
Pty weitergeleitet. Ich kann die letzte Seite davon jederzeit wie folgt abrufen: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 tunchown
, 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ürprintk
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 Ausgabetty
von dort in einer Umgebungsvariablen speichern und diesen Wert als Ziel fürgui
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.quelle
echo $?
da sie nutzlose Informationen hinzufügt und auf einem Bash-Fehler basiert, den ich gerade hier gemeldet habe: lists.gnu.org/archive/html/bug-bash/2014- 08 / msg00081.html und in der Debian-BTS: bugs.debian.org/cgi-bin/bugreport.cgi?bug=758969