[gelöst] Rückgabewert "Sub-"Terminal

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
TomL

[gelöst] Rückgabewert "Sub-"Terminal

Beitrag von TomL » 20.11.2015 22:33:02

Moin

Ich bin gerade dabei ein prinzipiell "fensterloses" Script zu basteln und brauche leider innerhalb des Scripts eine kurze Bestätigung durch den User. Wie kann ich an die Rückgabe der Eingabe kommen? Mit den beiden Varianten funktionierts nicht:

Code: Alles auswählen

#! /bin/bash
export response

retc=$(xterm -e 'read -p "starten (j/n)? " response ; [ "$response" == "n" ] && exit 0 || exit 1 ')
echo "retc="$retc

response="nix"
xterm -e 'echo "1="$response ; read -p "starten (j/n)? " response ; echo "2="$response ; [ "$response" == "n" ] && echo "n" || echo "j" ; sleep 2 '
echo "3="$response
Zuletzt geändert von TomL am 22.11.2015 18:44:59, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Rückgabewert "Sub-"Terminal

Beitrag von heisenberg » 20.11.2015 23:28:42

Ich empfehle eine Variante von "dialog" zu verwenden - Nicht "dialog" selbst, da dass nur in einem Terminal läuft, sondern die grafischen Varianten. Als da u. a. wären: "xdialog", "kdialog", "gdialog" oder "zenity".

TomL

Re: AW: Rückgabewert "Sub-"Terminal

Beitrag von TomL » 21.11.2015 00:30:48

Tja....mit zenity habe ich das Problem schon vor Wochen gelöst. Aber besondere Umstände erfordern es jetzt ohne Gui auszukommen. Ich habe ja ne Idee für eine Lösung .... rein in ne Datei und im Parent-Script auslesen.... aber das widerstrebt mir im Moment noch total. Deshalb hoffe ich , dass jemand ne elegantere Lösung hat, die mit Bash-Mitteln auskommt.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Rückgabewert "Sub-"Terminal

Beitrag von heisenberg » 21.11.2015 02:32:04

Sorry, das verstehe ich nicht. Du willst ohne GUI auskommen, startest aber ein xterm? Hä? Wieso kannst Du kein zenity starten, wenn Du ein xterm starten kannst? Hast Du die entsprechenden Programme nicht verfügbar?

---

Auch wenn ich es nicht verstehe. Du könntest in der Bash mit der Frage im separat erzeugten xterm den Prozess mit der $PPID(Parent-PID) killen. Das ist das xterm. Dann bekommst Du je nach Signal(15 wäre z. B. gut) mit dem Du killst einen anderen Wert als 0 als Exitstatus zurück. Das würde für eine Ja/Nein Frage reichen.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Rückgabewert "Sub-"Terminal

Beitrag von rendegast » 21.11.2015 04:08:39

Die Antwort in ein entsprechendes tempfile leiten,
das gäbe keine Schwierigkeiten mit Variablen von Sub-Prozessen.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

TomL

Re: AW: Rückgabewert "Sub-"Terminal

Beitrag von TomL » 21.11.2015 10:52:33

heisenberg hat geschrieben:Sorry, das verstehe ich nicht. Du willst ohne GUI auskommen, startest aber ein xterm? Hä? Wieso kannst Du kein zenity starten, wenn Du ein xterm starten kannst? Hast Du die entsprechenden Programme nicht verfügbar?
Xterm war ein Test, weil es mit lxterminal nicht funktionierte. Und natürlich läuft auch ein Windowsmanager. Ich bin nur nicht bereit 300 oder 400 MB an Abhängigkeiten für einen Zenity-Dialog für eine Y/N-Frage auf einem Low-Level-Setup zu installieren.

Ich werds via File lösen, wie ich das schon angedacht hatte und wie Rendegast das ebenfalls als Lösung betrachtet.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Rückgabewert "Sub-"Terminal

Beitrag von heisenberg » 21.11.2015 12:11:08

Ich bin nur nicht bereit 300 oder 400 MB an Abhängigkeiten für einen Zenity-Dialog für eine Y/N-Frage auf einem Low-Level-Setup zu installieren.
Ja, so was in der Art hatte ich mir später dann gedacht - Full Ack.

Hier nochmal die kill-Variante, die ich sehr elegant finde:

Code: Alles auswählen

if xterm -e 'read -p "Starten (j/n) : " response; [ $response == "j" ] || kill -TERM $PPID'
    then echo "Starte jetzt..."
    else echo "Abbruch durch Benutzer"
fi
oder ein bisschen schoener mit dialog:

Code: Alles auswählen

if xterm -e 'dialog --yesno "Jetzt starten?" 5 30 || kill -TERM $PPID '
        then echo "Starte jetzt..."
        else echo "Abbruch durch Benutzer"
fi
Mit benutzerdefinierten Signalen(Also Z. B. SIG_USR1 oder SIG_USR2) bekommt man dann auch noch mehr potentielle Auswahlmöglichkeiten.

Im übrigen ist xdialog eine sehr schlanke Variante von kdialog/xenity/.... Leider scheint der Entwickler etwas von Debian angenervt zu sein. D. h. bei Bedarf muss das kompiliert werden.

TomL

Re: Rückgabewert "Sub-"Terminal

Beitrag von TomL » 22.11.2015 18:36:12

Moin

Dank Eurer beiden Tips konnte ich das Problem jetzt lösen. Ich habe tatsächlich beide Tips zur Lösung verwendet. Für den Dialog habe ich mir die paar Kilobytes mit "dialog" installiert und das sieht sogar recht ansprechend aus. Die Rückgabe läuft über eine Datei. Und jetzt funktioniert es richtig gut.

Allerdings hat mich das doch jetzt echt lange beschäftigt und das war ein ziemlich unangenehmes Problem. Ich habe mich zulange mit dem Versuch aufgehalten, den Befehl Terminal->Dialog->RückgabeInFile innerhalb einer Zeile und innerhalb des Scripts zu realisieren. Aber keine Chance... -e mit mehreren Kommandos beim terminalstart funktionierte hier nicht, mit keiner Syntax. Es funktionierte erst mit rekursivem Start.

Ich habe das Beispiel jetzt mal mit lesbaren Texten versehen.... die ich aus Faulheit aus meinem anderen Script verwendet habe. In dem anderen Script läuft genau dieser Autoupdate erfolgreich mit Zenity. Dieses Beispiel bzw. die Texte hier haben nichts mit dem späteren eigentlichen Zweck zu tun, sondern das ist hier nur mein Testprogramm - die Texte sollen die Scriptlogik bzw. den Programmablauf nur anchaulicher und leichter verständlich machen. Der Fokus liegt allein auf dem Dialog und der Rückgabe dessen Ergebnisses an die Parent-Instanz. Drei unterschiedliche Rückgaben können passieren: 0=ja, 1=nein, 255=timeout

Code: Alles auswählen

#! /bin/bash

pushd `dirname $0` >/dev/null 2>&1
    ProgPath=`pwd`
    ProgFullName=$ProgPath/`basename $0`
popd >/dev/null 2>&1

text1="Sollen verfuegbare Updates automatisch installiert werden?\n\nWaehrend des Updates kann der PC ganz normal benutzt werden. Bitte den Rechner\nnicht ausschalten, bevor die Meldung erfolgt ist, dass die Updates abgeschlossen sind."
text2="Verfuegbare Updates wurden erfolgreich automatisch installiert!"

if [ "$1" == "-Q" ]; then
    dialog --timeout 240 --yesno "$text1" 8 96
    echo $? >$ProgFullName.response
    exit 0
fi    

#lxterminal --geometry=50x11 -e "dialog --yesno 'TextTextTextText\nZeile2Zeile2' 8 40" 
lxterminal --geometry=100x11 -e "$ProgFullName -Q"

i=0
while [ $i -lt 240 ]; do
    [ -f $ProgFullName.response ] && break
    i=$[$i+1]
    /bin/sleep 1
done

if [ -f $ProgFullName.response ]; then 
    response=$(cat $ProgFullName.response) 
    rm $ProgFullName.response 
fi

#debug
#echo $ProgFullName.response
#echo "response="$response

sync
if [ "$response" == "0" ]; then
    lxterminal --geometry=44x9 -e "dialog --timeout 60 --msgbox '$text2' 6 40"
fi

exit 1

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Rückgabewert "Sub-"Terminal

Beitrag von heisenberg » 11.02.2016 20:11:46

Nachtrag zum Thema: Zenity-Alternative ohne Bloat: Debiangxmessage (Ist nicht so hübsch, ist auch eher eine Alternative zu xmessage)

Antworten