• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Konsolen echos in Xdialog Box umleiten?

Hallo,
ich möchte in dem untenstehenden Listing die drei "echos" am Schleifenende gerne in ein Xdialog Fenster ausgeben,
statt in der Konsole. Dazu leite ich die echos in eine temporäre Datei um, die ich mir von Xdialog anzeigen lassen will.
Idealerweise sollten da nur die 3 echos drinstehen, solange bis die Schleife beendet ist.
Code:
 echo "Fortschritt des Kopiervorgangs: $z von $anzahl Dateien.">>/tmp/sau.txt
 echo "Die Gesamte Zeilenzahl in der Musikliste ist: $zeilenzahl">>/tmp/sau.txt
 echo "Die Zufallszeile ist Nummer: $kopierzeile">>/tmp/sau.txt
Das scheint auch grob zu klappen, im Moment scheitere ich aber daran, daß --tailbox und --textbox jeweils einen "Weiter" klick pro Schleifendurchlauf fordern. --no-buttons löst das Problem nicht.
Da ist wahrscheinlich ein Denkfehler drin, ich hänge...trotz Mr. Google... :irre:

Hier der Vollständigkeit halber die ganze Schleife (läuft so natürlich nicht, nur Auszug)
Code:
#Jetzt der eigentliche Kopiervorgang:
while [ $[$z] != $anzahl ]
do
  
    #Zufallszeile ermitteln
    kopierzeile=$((RANDOM % $zeilenzahl+1))
    
    #Pfad und Dateiname übergeben 
    inhalt=$(head -n${kopierzeile} /home/ingo/mp3list.txt|tail -n1)
              
    #nachsehen ob es schon einen Eintrag dieses Pfades in der Copyliste gibt
    a=`grep "$inhalt" /home/ingo/copylist.txt`
        
    #wenn Eintrag da ist, das Kopieren verbieten
    if [ "$inhalt" != "$a" ];
    then
	kopieren="ja"
    elif [ "$inhalt" = $a ];
    then
        kopieren="nein"
    fi
       
    #nun wird tatsächlich kopiert
    if [ "$kopieren" = "ja" ];
    then
       #echo "Kopieren ist: $kopieren"
       cp $inhalt $mp3target
       z=$[$z+1]
       #In die copyliste einfügen zum checken ob die Datei schon mal kopiert wurde
       echo $inhalt>>/home/ingo/copylist.txt 
       clear
    elif [ "$kopieren" = "nein" ];
    then
       echo "Die Datei $inhalt wurde schon mal kopiert...überspringe"
       sleep 2
       clear
       fi
    echo "Fortschritt des Kopiervorgangs: $z von $anzahl Dateien.">>/tmp/sau.txt
    echo "Die Gesamte Zeilenzahl in der Musikliste ist: $zeilenzahl">>/tmp/sau.txt
    echo "Die Zufallszeile ist Nummer: $kopierzeile">>/tmp/sau.txt
   
 Xdialog --no-buttons --title "Fortschritt:" --tailbox /tmp/sau.txt 50 80

done
rm /tmp/sau.txt
Wie immer für Input dankbar..
 
Hallo ingo.trautwein,

ingo.trautwein schrieb:
ich möchte in dem untenstehenden Listing die drei "echos" am Schleifenende gerne in ein Xdialog Fenster ausgeben,
statt in der Konsole.
Ich benutze kein XDialog sondern Zenity für diese Dinge, aber wenn Du dieses Programm verwenden möchtest, dann lies doch mal die Manpage Die Syntax ist ja ähnlich aufgebaut.

ingo.trautwein schrieb:
Dazu leite ich die echos in eine temporäre Datei um, die ich mir von Xdialog anzeigen lassen will.
Kann xdialog die Eingabe nicht direkt annehmen?
Code:
zenity --info --text="Fortschritt des Kopiervorgangs: $z von $anzahl Dateien."
Aber erwartest Du etwa das XDialog den geöffneten Dialog aufläßt und den Wert fortlaufend aktualisiert?
Afaik gibt es so eine Funktion nicht. Zenity bietet hierfür --pulsate an
Aber für einen Fortschittsbalken ist sowas doch viel schöner:
Code:
var=10; ( for var in 10 20 30 40 50 60 70 80 90 100; do echo $var; sleep 1; done ) | zenity --progress --text="Erfasse Dateien" --title="Installation" --percentage=0

ingo.trautwein schrieb:
Idealerweise sollten da nur die 3 echos drinstehen, solange bis die Schleife beendet ist.
Kannst Du bitte mal genauer erklären was Du machen willst, welchen Zweck Du damit erfüllen möchtest?

ingo.trautwein schrieb:
Code:
 echo "Die Gesamte Zeilenzahl in der Musikliste ist: $zeilenzahl">>/tmp/sau.txt
echo "Die Zufallszeile ist Nummer: $kopierzeile">>/tmp/sau.txt
So in Zenity:
Code:
zenity --info --text="Die Gesamte Zeilenzahl in der Musikliste ist: $zeilenzahl"
zenity --info --text="Die Zufallszeile ist Nummer: $kopierzeile"

ingo.trautwein schrieb:
Code:
    inhalt=$(head -n${kopierzeile} /home/ingo/mp3list.txt|tail -n1)
              
    #nachsehen ob es schon einen Eintrag dieses Pfades in der Copyliste gibt
    a=`grep "$inhalt" /home/ingo/copylist.txt`
Warum einmal die alte Schreibweise mit `kommando` und ein anderes mal die einfachere mit $(kommando)?

Lieben Gruß aus Hessen
 
@herz von hessen
Ich probiere mal Deine zenity Kommandos aus.
Kannst Du bitte mal genauer erklären was Du machen willst, welchen Zweck Du damit erfüllen möchtest?
Ich brauche eigentlich nur eine Fortschrittsanzeige.
ingo.trautwein hat geschrieben:
CODE: ALLES AUSWÄHLEN
inhalt=$(head -n${kopierzeile} /home/ingo/mp3list.txt|tail -n1)

#nachsehen ob es schon einen Eintrag dieses Pfades in der Copyliste gibt
a=`grep "$inhalt" /home/ingo/copylist.txt`
Warum einmal die alte Schreibweise mit `kommando` und ein anderes mal die einfachere mit $(kommando)?
Ist noch nicht einheitlich, weil ich den code aus verschiedenen Tutorials genommen habe,
war bisher froh, daß das Ding überhaupt läuft... :eek:ps:
Aber erwartest Du etwa das XDialog den geöffneten Dialog aufläßt und den Wert fortlaufend aktualisiert?
Genau das!

Vielen Dank erstmal,
Ich melde mich wieder.
 
ingo.trautwein schrieb:
Das scheint auch grob zu klappen, im Moment scheitere ich aber daran, daß --tailbox und --textbox jeweils einen "Weiter" klick pro Schleifendurchlauf fordern.
In echten GUIs kann man sowas (Update ohne Benutzereingabe) programmieren, aber den Funktionsumfang von Xdialog dürfte das übersteigen.
 
Hallo ingo.trautwein,

ingo.trautwein schrieb:
Ich brauche eigentlich nur eine Fortschrittsanzeige.
Fortschritt bei welcher Aktion?
Bei dem nachfolgenden Kommando pulsiert der Wartebalken solange bis das ls Kommando beendet ist und schließt den Wartedialog selbstständig.
Code:
ls -lR / 2>/dev/null | zenity --progress --text="Bitte einen Moment Geduld ...." --pulsate --auto-close
Man kann die Ausgabe von ls -lR / ja in eine Datei /tmp/tempfile umleiten und mit if testen ob die Datei existiert.
Ist die Datei existent kann dann ein weiteres Kommando die Datei anzeigen z.B.: zenity --text-info --filname=/tmp/tempfile

ingo.trautwein schrieb:
Ist noch nicht einheitlich, weil ich den code aus verschiedenen Tutorials genommen habe,
war bisher froh, daß das Ding überhaupt läuft... :eek:ps:
Verstehe.

ingo.trautwein schrieb:
herz-von-hessen schrieb:
Aber erwartest Du etwa das XDialog den geöffneten Dialog aufläßt und den Wert fortlaufend aktualisiert?
Genau das!
Wie gesagt geht das afaik nicht weil man dem Dialog ja nichts mehr übergeben kann wenn er mal gestartet ist.

Mit folgendem Kommando wird zum Beispiel das --text-info (Anzeigefenster) mit der Ausgabe des ls Kommandos gefüttert:
Code:
ls -lR / > /tmp/file | zenity --text-info --width=600 --height=600 --title="Das ist nur eine ellenlange Textausgabe"  --filename=/tmp/file

Hier mal ein Beipielscript das den Wartebalken in 10 Schritten von 0% auf 100% bringt.
Code:
#!/bin/bash

i=0
(while [ $((i <= 100)) '=' 1 ]
do
    echo $i
    sleep 1
    i=$((i + 10))
done) | zenity --progress --auto-close --title="Test Titel"  \
               --text="Bitte einen Moment Geduld ...."  --percentage=1

@abgdf
abgdf schrieb:
In echten GUIs kann man sowas (Update ohne Benutzereingabe) programmieren, aber den Funktionsumfang von Xdialog dürfte das übersteigen.
Mir ist jedenfalls auch noch keine Möglichkeit untergekommen.

Lieben Gruß aus Hessen
 
Hab' mir das noch mal näher angesehen. Erstaunlicherweise kann Xdialog das doch.
Dabei darf Xdialog aber nur einmal gestartet werden, muß also außerhalb, das heißt vor der while-Schleife stehen. Und man muß ein "&" hinzufügen, damit der Mainloop von Xdialog nicht den weiteren Skriptablauf blockiert. Also so:
Code:
#!/bin/bash

echo "Fortschritt:" > sau.txt
Xdialog --title "Fortschritt:" --tailbox sau.txt 50 80 &

x=1
while [ $x -le 10 ]
do
    echo "x ist $x" >> sau.txt
    let "x += 1"
done
HTH
 
@abgdf:
:D - Danke - Genau das wollte ich haben. :thumbs:
Schön dass es auchmit Xdialog funzt, das ist ein nettes kleines Progrämmchen ohne viel Overhead.
(nichts gegen zenity oder kdialog...die habe ich eben auf meinem LXDE nicht installiert.
Ich hatte mit --tailbox schon das richtige Werkzeug, aber natürlich...es muss ausserhalb der Scheife stehen. :irre:
Mal wieder den Wald vor Bäumen nicht gesehen...

Das Skript sieht nun im Prinzip so aus:
Code:
typeset -i anzahl z
#temporäre Datei erzeugen
echo -n > /home/ingo/progress.txt
Xdialog --title "Fortschritt:" --tailbox /home/ingo/progress.txt 50 80 &

while [ $[$z] != $anzahl ]
   do
   #hier passieren dann die Kopiervorgänge, habe ich weggelassen
  
   #die echos werden nun in der temporären Datei progress.txt unten angehängt 
   echo "Fortschritt des Kopiervorgangs: $z von $anzahl Dateien.">>/home/ingo/progress.txt
   echo "Die Gesamte Zeilenzahl in der Musikliste ist: $zeilenzahl">>/home/ingo/progress.txt
   echo "Die Zufallszeile ist Nummer: $kopierzeile">>/home/ingo/progress.txt   
   z=z+1
done
#temporäre Datei tschüssen.
if [ -e /home/ingo/progress.txt ];
then
rm /home/ingo/progess.txt
fi
Die Tailbox bleibt nun stehen und zeigt mir den Fortschritt in der Schleife. :D
Jetzt wird sie noch positioniert, daß sie nicht die anderen Dialogfenster überdeckt oder drunterliegt.
Nun werde ich das Ding noch mit dem tool "shc" kompilieren, dann können es normale user ohne Umweg über xterm aus der GUI starten!
(ist für mich selber nicht wichtig, aber für mein Hobbyprojekt "Sekretärinnensicherer Desktop")

Danke nochmal für die aktive Mithilfe auch an die anderen, so macht das Arbeiten mit der bash richtig Spass.
Ich kriege immer mehr Respekt, was dieses Ding kann.
 
Oben