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

Script beim drücken auf Abbrechen in Zenity nicht ausführen

Mahlzeit,

ich habe für mein Problem aktuell kein Beispielscript. Angenommen ich lasse eine Audiodatei mit ffmpeg umwandeln:

Code:
ffmpeg -i input -ab 160k output

Ich könnte jetzt mit Zenity und der Dateiauswahl die Inputdatei und den Ausgabeordner wählen. Drücke in dem Auswahldialog auf "OK" setzte Zenity die Auswahl in das Script ein. Gehe ich aber auf "Abbrechen" wird nichts eingesetzt, das Script aber dennoch ausgeführt. Im o.g. Fall macht das nichts, kann aber auch in anderen Konstellationen blöd sein. Wie biege ich das so zurecht, dass er wenn ich "Abbrechen" im Datei-/Ordnerauswahldialog drücke, das Script überhaupt nicht startet?

Hab auch für yad nichts gefunden, das nutze ich aber nicht. Ich bin mit Zenity immer schneller zum Ziel bekommen.
 

josef-wien

Ultimate Guru
https://de.wikipedia.org/wiki/Zenity schrieb:
Zenity [ˈzenətɪ] ist ein plattformunabhängiges Programm, das es erlaubt, GTK-Dialoge von der Kommandozeile oder von Shell-Skripten aus zu starten.
Ich sehe nicht, daß ffmpeg in diese Definition fällt, aber wenn es wichtig ist, daß die von wem auch immer an ein Skript (oder jedes andere Programm) übergebenen Daten stimmen, dann ist die Plausibilität dieser Daten bzw. das Vorhandensein von Dateien oder Verzeichnissen zu prüfen, bevor mit der eigentlichen Verarbeitung begonnen wird.

P. S. Ich kenne "Zenity" nicht, aber vielleicht fällt Deine Beobachtung in die Kategorie "It is a feature, not a bug.".
 
OP
B

bunter fisch

Member
Zum Beispiel das hier

Code:
ffmpeg -i input.mp3 "$(zenity --file-selection --directory='/home/fisch/')"/output.mp3

Wähle ich einen Ordner aus wird die Output-Datei in diesen Ordner geschrieben, gehe ich auf Abbrechen wird die Datei in den Ordner der Input-Datei geschrieben.
 

abgdf

Guru
Du führst ffmpeg ja auch unbedingt aus, und nicht nur dann, wenn zenity etwas liefert.
Mach' das so:
Code:
#!/bin/bash

a=$(zenity --file-selection --directory --filename='/home/fisch')
if test -n "$a"
then
    echo "Doing something with ffmpeg $a"
else
    echo "Doing nothing."
fi
 

susejunky

Moderator
Teammitglied
Hallo bunter fisch,

bunter fisch schrieb:
Zum Beispiel das hier

Code:
ffmpeg -i input.mp3 "$(zenity --file-selection --directory='/home/fisch/')"/output.mp3

Wähle ich einen Ordner aus wird die Output-Datei in diesen Ordner geschrieben, gehe ich auf Abbrechen wird die Datei in den Ordner der Input-Datei geschrieben.
In Ergänzung zu dem was abgdf bereits gesagt hat, hier noch zwei Beispiele (die Du in der Befehlszeile einer Konsole ausführen kannst), die zeigen welche Rückgabewerte Du auswerten kannst:

Code:
> A="X";A=`zenity --file-selection --directory="~"`; echo "Returncode: $? Auswahl: >$A<" 
Returncode: 0 Auswahl: >/home/user/ausgewähltes_Verzeichnis<
>
Zunächst wird die Variable A mit "X" vorbelegt. Dann wird "zenity" aufgerufen. Das Verzeichnis "/home/user/ausgewähltes_Verzeichnis" wird ausgewählt und der Dialog mit "OK" beendet. Dadurch wird das ausgewählte Verzeichnis in der Variablen A und der Returncode des Aufrufs von "zenity" in der Variablen $? gespeichert. "echo" gibt dann die beiden Variablen aus.

Code:
> A="X";A=`zenity --file-selection --directory="~"`; echo "Returncode: $? Auswahl: >$A<" 
Returncode: 1 Auswahl: ><
>
Zunächst wird die Variable A mit "X" vorbelegt. Dann wird "zenity" aufgerufen. Der Dialog wird mit "Abbrechen" beendet. Ob ein Verzeichnis ausgewählt wurde oder nicht ist dabei nicht von Bedeutung. Dadurch wird "" in der Variablen A und der Returncode des Aufrufs von "zenity" in der Variablen $? gespeichert. "echo" gibt dann die beiden Variablen aus.

Viele Grüße

susejunky
 

abgdf

Guru
Wenn Du's unbedingt in einer Zeile haben willst, kann man Dein Beispiel
bunter fisch schrieb:
Code:
ffmpeg -i input.mp3 "$(zenity --file-selection --directory='/home/fisch/')"/output.mp3
auch so machen:
Code:
a=$(zenity --file-selection --directory --filename='/home/fisch');if test -n "$a";then ffmpeg -i input.mp3 "$a/output.mp3";fi
 
Oben