Wie leite ich stdout und stderr in einem Bash-Skript mit Dialogfeldern um?

Wie leite ich stdout und stderr in einem Bash-Skript mit Dialogfeldern um?

Für ein einzelnes Skript, das stdout und stderr folgendermaßen in eine Datei umleitet:

./myscript.sh 2>&1 | tee -a out_file

funktioniert einwandfrei. Wenn ich versuche, auf die gleiche Weise ein Skript auszuführen, das mehrere Dialogfelder enthält, die mitDialogBefehl (und Aufruf anderer Skripte)

./main.sh 2>&1 | tee -a out_file

Die Ausgabedatei enthält aufgrund dieser Felder unerwünschte Zeichen. Beispiel:

#!/bin/bash
# myscript.sh

dialog --title "Title" \
--msgbox "Message Box" \
30 120
date 

erzeugt mit:

$ ./myscript.sh 2>&1 | tee -a myscript.out

mehrere Zeilen ähnlich dieser:

[36m[44m  [30m[40m[K[22;38H[39;49m(B[m[2;3H[30m[47mMessage Box[22;38H[39;49m(B[m

Wie bekomme ich stdout und stderr ohne diese Zeichen (für main und alle nachfolgenden Skripte)? Das wäre im Beispiel die Ausgabe vonDatum. Schön zu haben wäre, was ein Benutzer in ein Eingabefeld eingegeben hat.

Antwort1

Sie versuchen, farbcodierte Ausgaben in eine Datei zu protokollieren. Siehe Farben und Formatierung in Bash:https://misc.flogisoft.com/bash/tip_colors_and_formatting

Sie können in diesem Fall die Standardausgabe nicht beliebig ändern. Denn wenn Sie die Standardausgabe für die Protokollierung optimieren, ändern Sie auch die Ausgabe, die der Benutzer sieht.

Aber Sie haben einige Möglichkeiten:

  • Am einfachsten ist es, in Ihrem myscript.sh den Befehl hinzuzufügen, echo "Message Box printed" >> myscript.outum einige Aktionen direkt in der Datei aufzuzeichnen.

  • Sie können versuchen ./myscript.sh 2>&1 | sed -e "s/<your regex>//g" | tee -a myscript.out, zu ersetzen <your regex>. Aber das ändert auch die Ausgabe. Ich denke also, das ist nicht das, wonach Sie suchen.

  • Oder Sie erstellen Ihren eigenen Deskriptor in myscript.sh mit echo "Exit code: $? Textbox $usertext" 1>&4und ändern den Dialogbefehl wie folgt usertext=$(dialog --title "Title" --inputbox "Enter your text:" 30 120 "My Text" 3>&1 1>&2 2>&3)Dann können Sie verwenden. myscript.sh 4>> myscript.out

verwandte Informationen