Dialog Menü Probleme

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
trg2889
Beiträge: 137
Registriert: 01.07.2015 08:45:36

Dialog Menü Probleme

Beitrag von trg2889 » 30.05.2017 11:57:49

Hallo zusammen,
ich habe mir mittels Dialog folgendes Menü gebastelt

Code: Alles auswählen

#!/bin/bash
#---------------------------------------------------------------------
# Function: MainMenu
# Description:Anzeige des Menus und Untermenus		
#---------------------------------------------------------------------
#
# Purpose - display output using msgbox 
#  $1 -> set msgbox height
#  $2 -> set msgbox width
#  $3 -> set msgbox title
#
function display_output(){
	local h=${1-10}			# box height default 10
	local w=${2-41} 		# box width default 41
	local t=${3-Output} 	# box title 
	dialog --backtitle "Server-Verwaltungsscript" --title "${t}" --clear --msgbox "$(<$OUTPUT)" ${h} ${w}
}
INPUT=/tmp/menu.txt

# trap and delete temp files
trap "rm $INPUT; exit" SIGHUP SIGINT SIGTERM

# Laden der Submenus
source $PWD/functions/menu/ansiblemenu.sh

while true
do

### display main menu ###
dialog --clear  --help-button --backtitle "Verwaltungsscript" \
--title "[ Hauptmenü ]" \
--menu "Bitte benutzen Sie die Pfeiltasten um zu Navigieren  \n\
\n\
Bitte wählen Sie" 15 90 4 \
Backup "Backup des Remoteservers" \
Ansible "Verwaltung des Servers mittels Ansible" \
Beenden "Beende das Programm" 2>"${INPUT}"

menuitem=$(<"${INPUT}")

case $menuitem in
	Backup) BackupMenu;;
	Ansible) AnsibelMenu;;
	Beenden) clear; echo "Bye"; break;;
esac
done
Rufe ich das Menü über das Terminal normal auf, funktioniert auch soweit alles. Setze ich aber das Menü in eine Funktion und wird vom Hauptscript aus aufgerufen, kann ich die Pfeiltasten und Tabtasten nicht verwenden. Es erscheint wenn ich zum Beispiel die Pfeiltaste runter verwende folgende Ausgabe:^LOB
Jemand eine Ahnung, warum das passiert. Ich würde das Problem auch selber suchen, aber mir fallen dazu auch keine Suchbegriffe ein.
Danke schonmal im Vorraus

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

Re: Dialog Menü Probleme

Beitrag von rendegast » 30.05.2017 14:50:51

INPUT=/tmp/menu.txt

# trap and delete temp files
trap "rm $INPUT; exit" SIGHUP SIGINT SIGTERM

...
Beenden "Beende das Programm" 2>"${INPUT}"

menuitem=$(<"${INPUT}")
Ich würde vorschlagen

Code: Alles auswählen

INPUT=$(tempfile)
...
und zum Aufräumen

Code: Alles auswählen

...
menuitem=$(<"${INPUT}")
rm $INPUT
...
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

trg2889
Beiträge: 137
Registriert: 01.07.2015 08:45:36

Re: Dialog Menü Probleme

Beitrag von trg2889 » 30.05.2017 15:30:32

Okay danke erstmal werde ich heute Abend testen wenn ich wieder vor dem PC bin

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

Re: Dialog Menü Probleme

Beitrag von rendegast » 30.05.2017 18:43:34

Obiges ist nur eine allgemeine Anmerkung.
Setze ich aber das Menü in eine Funktion und wird vom Hauptscript aus aufgerufen,
kann ich die Pfeiltasten und Tabtasten nicht verwenden.
Es erscheint wenn ich zum Beispiel die Pfeiltaste runter verwende folgende Ausgabe:^LOB
?
In der Art

Code: Alles auswählen

#!/bin/[ba]sh

testfunc() {
    /tmp/test/test.bash
}

testfunc
als bash oder sh funktioniert es scheinbar.
(im xterm)



-------------------------------------
Mein
...
menuitem=$(<"${INPUT}")
rm $INPUT
...
ist ein grober Schnitzer.
Durch dieses Löschen und Wiederanlegen, weil in der Schleife,
gibt es eine Möglichkeit zum Angriff.
Also eher:

Code: Alles auswählen

...
esac
done

rm $INPUT

---------------------------------------
Anmerkung
In doc/dialog/examples/ gibt es prima Beispiele,
zBsp. examples/menubox
<- setup-vars
<- setup-tempfile
wo dann auch der Abbrechen-Button funktioniert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dialog Menü Probleme

Beitrag von breakthewall » 30.05.2017 21:06:51

trg2889 hat geschrieben:

Code: Alles auswählen

function display_output(){
	local h=${1-10}			# box height default 10
	local w=${2-41} 		# box width default 41
	local t=${3-Output} 	# box title 
	dialog --backtitle "Server-Verwaltungsscript" --title "${t}" --clear --msgbox "$(<$OUTPUT)" ${h} ${w}
}
Wenn es hier primär nur darum geht die Fenstergröße an den Output anzupassen, dann könnte man sich das auch sparen, und eine feste Größe definieren die allem gerecht wird. Das Terminalfenster könnte man dann stets via resize den Bedingungen anpassen.
trg2889 hat geschrieben:

Code: Alles auswählen

INPUT=/tmp/menu.txt
Wenn man das schon so macht, dann sollte man Pfade immer in Doublequotes setzen. Und für sichere temporäre Pfade gibt es mktemp, was dafür gemacht wurde. Mit was wird eigentlich die undefinierte $OUTPUT Variable gespeisst? Kommt das über die eingebundene Datei?

Würde nach Möglichkeit alles rein RAM basierend umsetzen, ohne die Festplatte zu berühren:

Code: Alles auswählen

INPUT="/dev/shm/menu.txt"
trg2889 hat geschrieben:

Code: Alles auswählen

# trap and delete temp files
trap "rm $INPUT; exit" SIGHUP SIGINT SIGTERM
Eine trap zu nutzen ist eine gute Sache, was so beibehalten solltest. Doch die Kombination der Signale kann für Überschneidungen sorgen, wodurch der Inhalt der trap mehrfach oder unbeabsichtigt ausgeführt wird. Daher kann man das mit dem Pseudosignal EXIT ersetzen, wodurch die trap aktiviert wird sobald das Shellscript auf verschiedenste Weise endet. Zu empfehlen ist auch den Inhalt der trap immer in Singlequotes zu setzen, damit der Inhalt erst dann aufgelöst wird wann man es beabsichtigt hat.

Beispiel:

Code: Alles auswählen

trap 'rm "$INPUT"; exit' EXIT
trg2889 hat geschrieben:

Code: Alles auswählen

menuitem=$(<"${INPUT}")
Das hier ist soweit nicht verkehrt.

Ein noch sicherer Vorschlag wäre:

Code: Alles auswählen

menuitem="$(<"${INPUT}")"
trg2889 hat geschrieben:Rufe ich das Menü über das Terminal normal auf, funktioniert auch soweit alles. Setze ich aber das Menü in eine Funktion und wird vom Hauptscript aus aufgerufen, kann ich die Pfeiltasten und Tabtasten nicht verwenden.
Dazu könntest mal deine Funktion angeben, wie auch den Rest der zum Shellscript gehört bzw. mit eingebunden wird.

Antworten