Die stderr-Umleitung in der Subshell ändert die Ausgabe von tput

674
816-8055

Also arbeite ich an einem Skript und habe ein seltsames Verhalten gefunden. Ich bin sicher, dass es eine logische Erklärung dafür ist, warum die Ausgabe der 4 - ten und 6 ten Befehlszeile als in den anderen Fällen unterschiedlich ist, aber ich kann nicht, es zu finden.

1 $ tput cols 128  2 $ tput cols 2>/dev/null 128  3 $ echo $(tput cols) 128  4 $ echo $(tput cols 2>/dev/null) 80  5 $ (tput cols >/tmp/cols.txt); cat /tmp/cols.txt 128  6 $ (tput cols &>/tmp/cols.txt); cat /tmp/cols.txt 80  7 $ echo $(tput cols 2>/dev/null; echo $COLUMNS; tput cols) 80 128 128 

Warum ändert die stderr-Umleitung die Ausgabe von tput in einer Subshell?

Letztendlich möchte ich etwas in meinem Skript machen, damit es auf Systemen funktioniert, auf denen Tput / ncurses nicht verfügbar ist:

cols=$(tput cols 2>/dev/null || echo $COLUMNS) 

Das obige Beispiel wurde mit Bash 4.3.46 (1) -release und den ncurses 6.0.20150627 erstellt

4
Ich habe dies nicht auf meinem Rapper, aber die Anzahl der Spalten kann anders sein, wenn die Ausgabe nicht interaktiv ist (wie eine Datei oder / dev / null). Archemar vor 7 Jahren 0

1 Antwort auf die Frage

2
grawity

Demnach stracegeschieht dies, weil tputnur versucht wird, tty-Einstellungen von stdout und stderr (fd 1 & 2) zu lesen. Da Sie stderr explizit umgeleitet haben und $( )stdout auch umgeleitet werden, gibt tput auf.

Die beste Lösung wäre, Patches zu patchen, um stdin auch auf Vorhandensein einer tty zu überprüfen . Sie können die 2>/dev/nullWeiterleitung jedoch auch einfach entfernen, da tput colsohnehin keine Fehlermeldungen ausgegeben werden. (Und wenn es Fehlermeldungen ausgegeben hat, ist es am besten, auf sie zu achten.)

Ja, das könnte es sein. Ich muss den Fehler unterdrücken, falls tput nicht verfügbar ist. Als Workaround mache ich folgendes: if tput cols &> / dev / null; dann cols = $ (tput cols) sonst cols = $ COLUMNS fi 816-8055 vor 7 Jahren 0