ubuntuusers.de

stderr Umleitungen

Status: Gelöst | Ubuntu-Version: Lubuntu 16.04 (Xenial Xerus)
Antworten |

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Ich habe es mal ausprobiert und die m.E. didaktisch nicht gut gemachte manpage von dialog gelesen bzw. überflogen.

Wenn ich:

1
dialog --backtitle "Desktop System"   --radiolist "Select Desktop:" 10 40 4         1 Gnome off         2KDE on         3 XFCE off 2>dialog.err

eingebe, und danach dialog.err ausgebe, erhalte ich, je nach Auswahl, 1, 2 oder 3.

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo seahawk1986,

danke für Deine Antwort. Du hast Recht. Mein Fehler. Ich habe tatsächlich nicht mit der Leertaste bestätigt. Jetzt funktioniert´s. Aber erst nachdem ich in Zeile 29 das case-statement richtigerweise auf "GNOME" umgeändert habe. Tatsächlich habe ich das Skript von Seite https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/ übernommen und den Fehler so mitkopiert.

Danke nochmals für die Aufklärung.

Grüsse. Rosika ☺

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hi user_unknown,

danke auch Dir für Deine Antwort. Ich habe Deine Befehlszeile ausprobiert, und es hat nicht funktioniert. Bei genauerem Hinsehen bemerkte ich dann, woran es lag. Dein "2KDE on " hatte kein Leerzeichen. Sobald ich´s dann eingefügt habe klappte es wunderbar. 😊

Jetzt habe ich ja die Antwort auf meine ursprüngliche Frage. Ist mir bis jetzt noch unklar, warum das bislang bei mir nicht geklappt hat.......

Noch eine dumme Frage am Schluß: Wie müsste denn jetzt der Befehl lauten, wenn ich das Ergbnis nicht in eine Datei, sondern in eine Variable schreiben möchte?

Herzlichen Dank.Grüsse. Rosika

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Tja ... da kommt jetzt das ins Spiel, was ich ganz oben schon verlinkt hatte. 😉 → die Devices müssen umgebogen werden.

Du kannst es konkret hier nachlesen wie das geht, einschließlich der Erläuterung dazu. Bei Dir wäre das demnach:

1
2
3
4
5
6
exec 3>&1                            # richte das Hilfs-Device ein und leite es (außerhalb) direkt nach /dev/stdout um
ergebnis=$( dialog --backtitle "Desktop System" --radiolist "Select Desktop:" 10 40 4
         1 Gnome off
         2 KDE on
         3 XFCE off   2>&1 >&3 )     # (von rechts nach links:) leite die Ausgabe von /dev/stdout -> Hilfsdevice um
                                     #                            und die Ausgabe von /dev/stderr -> /dev/stdout

... und von dort geradewegs mit der Command Substitution in die Variable.

LG,

track

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo track,

ich habe mich nun intensiv mit Deiner Lösung beschäftigt. Vielen herzlichen Dank. Ich denke, ich komme jetzt klar damit.

Wenn ich´s richtig verstanden habe, dient das Hilfs-Device zum Vertauschen von /dev/stderr und /dev/stdout. Für einen Bash-Scripting-Anfänger, wie mich, ist die Syntax nicht so einfach zu verstehen. Ich werde mich weiter intensiv damit befassen. Muß doch irgendwie zu kapieren sein. 😉

Auf jeden Fall sind jetzt alle Fragen geklärt, und ich möchte mich noch einmal sehr für Eure Hilfe bedanken. Gut, dass es solch ein tolles Forum gibt und so viele Experten am Werk sind.

Viele lieben Grüsse. Rosika ☺

P.S.: Die dialog --calendar-Funktion bekomme ich aber gar nicht zum Laufen. Dafür poste ich dann aber wohl lieber einen neuen Thread.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Rosika schrieb:

Hi user_unknown,

danke auch Dir für Deine Antwort. Ich habe Deine Befehlszeile ausprobiert, und es hat nicht funktioniert. Bei genauerem Hinsehen bemerkte ich dann, woran es lag. Dein "2KDE on " hatte kein Leerzeichen. Sobald ich´s dann eingefügt habe klappte es wunderbar. 😊

Hi Rosika, Ja, das mit dem 2KDE ist eine Anomalie, die wohl daher kommt, dass da ein Tab stand, und ich es per Cut-and-Paste übernommen habe. Beim Verarbeiten hat die Bash den Tab wohl als Whitespace übergeben bekommen, aber in der Anzeige irgendwie verschusselt, sowas hatte ich schon häufiger. Beim Kopieren des Outputs zurück ins Fenster hier ist dann der Tab nicht wieder aufgetaucht sondern war dann endgültig weg.

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hi user_unknown,

danke für die Aufklärung.

Viele Grüsse. Rosika

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

@track

Hallo track,

nachdem ich mich, so gut wie´s ging, ein wenig mit Deinem Lösungsvorschlag beschäftigt habe, sind mir noch ein paar Fragen gekommen. Ich will ja immer etwas dazulernen. 😉

1.) Zeile 5:

2>&1 >&3

Deine Erklärung habe ich soweit verstanden, aber warum ist es eigentlich nicht möglich, gleich 2>&3 zu machen, also /dev/stderr gleich ins Hilfsdevice umzuleiten?

2.) Eingangs schriebst Du, man müsse die Devices /dev/stdin und /dey/stdout vertauschen, am besten über ein Hilfsdevice. In Zeile 5 sehe ich die Umleitung 2>&1, aber in welcher Zeile wird eigentlich der umgekehrte Fall definiert, wegen des Vertauschens?

3.) In Zeile 1:

exec 3>&1

Hast Du die "3" aus einem bestimmten Grund gewählt, weil´s nach "1" und "2" kommt, oder ist die Zahl egal? Könnte man auch "4" wählen, oder funktioniert´s nur mit "3"?

4.) 1.) Zeile 5:

2>&1 >&3

Ist das Leerzeichen vor "&3" wichtig, oder hast Du es nur zur Übersichtlichkeit eingefügt?

5.) Kommentar in Zeile 1: > # richte das Hilfs-Device ein und leite es (außerhalb) direkt nach /dev/stdout um Was konkret ist mit "außerhalb" gemeint? Außerhalb der laufenden Shell?

Hoffentlich nerve ich nicht zu sehr, aber ich möchte halt´ zu gerne verstehen, was sich da konkret abspielt.

Herzliche Grüsse. Rosika ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

... ok, also zum Thema "Umleitungen":

In dem Strang von 2010, den ich oben verlinkt hatte, hatten wir damals auch schon verschiedene Varianten diskutiert und erläutert. (→ lies es nochmal durch !)

Die übliche Grund-Version ist, die Devices reihum zu vertauschen:   3>&2 2>&1 1>&3 (und ja: die Device-Nummer ist egal, solange man die 0, 1 und 2 in Ruhe lässt)
Die Simpel-Version   2>&1 1>&2   funktioniert nämlich nicht: dabei werden die beiden Datenströme vermischt.

Zum testen und zeigen erzeuge ich hier die Ausgabe einfach mal mit awk :

track@track:~$ var=$( awk 'BEGIN{ print "out"; print "err" > "/dev/stderr"}' )
err
track@track:~$ echo "$var"
out 

dann kann man dabei die beiden Ausgaben entsprechend vertauschen: (womit die Error-Ausgabe in der Variablen landet)

track@track:~$ var=$( awk 'BEGIN{ print "out"; print "err" > "/dev/stderr"}'  3>&2 2>&1 1>&3 )
out
track@track:~$ echo "$var"
err 

Ob Du die Devices nun rechs herum oder links herum vertauscht, ist egal. Du musst nur aufpassen, dass das Device zuerst mal existiert, bevor Du es umleiten kannst:

track@track:~$ var=$( awk 'BEGIN{ print "out"; print "err" > "/dev/stderr"}' 2>&1 1>&3 3>&2 )
track@track:~$ echo "$var"
bash: 3: Ungültiger Dateideskriptor 

Die Fehlermeldung landet hier sehr wohl in der Variablen (  2>&1   funktioniert also), aber der Deskriptor, auf den mit  1>&3   umgeleitet werden soll, existiert da noch nicht. Deshalb bricht er vor der letzten Umleitung ab, und auf /dev/stderr kommt nichts an.

Die Version von mir oben ist nun eine Abkürzung: statt  1>&3  kann man  >&3  schreiben, und die Umleitung des Filedeskriptors 3 hatte ich nach vorn herausgezogen. Mehr steckt eigentlich nicht dahinter.

Es loht sich, die Links auf Greg's Wiki nachzulesen, da ist das alles noch sehr viel ausführlicher erklärt.
Und ansonsten: probier einfach selber die verschiedenen Varianten durch, so wie ich hier oben.

LG,

track

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hallo track,

vielen herzlichen Dank für Deine Erklärungen. Da hast Du Dir echt Mühe gegeben. Und wenn ich auf die Uhrzeit sehe: Mitten in der Nacht, bzw. am frühen Morgen. Respekt. Da hätte ich wohl nicht die Konzentration dafür aufbringen können. 😳

Anhand Deiner Beispiele habe ich´s jetzt verstanden. Ich habe sie auch in meinem Terminal nachvollzogen. Klappt alles wie beschrieben. Ich denke, ich werde die Umleitungen jetzt bewerkstelligen können. Danke auch für die neuen Links; da habe ich wieder Lesematerial. Auch Deinen Link von 2010 lese ich mir nochmal durch, wie von Dir empfohlen.

Ich finde es echt klasse und lieb von Dir, dass Du so geduldig auf meine Fragen geantwortet und so viel Energie reingesteckt hast.

Nochmals vielen Dank und viele Grüsse und ein schönes Wochenende.

Rosika ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na ja. die Uhrzeit hatte sich ergeben, weil ich das gestern noch als letztes erledigt hatte - ergab sich einfach so.

Wenn Du noch Lesestoff suchst, empfehle ich Dir Greg's Wiki insgesamt: der erklärt absolut wasserdicht und sehr praktisch.
Na ja, und vielleicht auch noch meine eigene Linksammlung ...

LG und viel Erfolg,

track

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hi track,

danke für Deine erneute Rückmeldung und die Links. Die werd´ ich sicher gut gebrauchen können.

Grüsse. Rosika ☺

Antworten |