aus Skript heraus Xterm

16/06/2011 - 23:11 von Lukas Gantert | Report spam
Guten Abend,

Ich habe für meine Kids ein Rechnen-Lernspiel-Skript zusammengebastelt.
Nun möchte ich das Skript in einer Xterm mit grösserer Schrift und
farbigem Hintergrund ausführen lassen. Das geht auch, wenn ich zuerst eine
Xterm öffne und dann darin das Skript ausführe.

Elegant wàre nun - ich komme dem Trick aber partout nicht auf die Schliche
- wenn ich direkt aus dem Skript heraus zuerst eine Xterm starten könnte,
in der dann der Rest des Skripts, also das eigentliche Progràmmchen
ausgeführt wird.

Ich habe alles ausprobiert und das Netz abgescannt bis zum geht nicht mehr
und bin zum Schluss gekommen, entweder bin ich strohdumm oder es geht
tatsàchlich nicht (im Sinn von "das Pferd am eigenen Schwanz aufzàumen").

Mein Anliegen ist nicht dringend, aber es fuxt mich schon lànger, dass ich
so was einfaches nicht schaffe. Vielleicht habt ihr hier ja den
entscheidenden Tipp dazu.

Der Xterm-Aufruf sàhe etwa so aus und kàme vermutlich direkt nach der
Shebang im Skript, aber eben, die -e Option will so nicht funktionieren
(darum habe ich sie hier weggelassen):

xterm -bg skyblue2 -fg white -fn -*-*-*-r-*-*-24-*-*-*-m-*-iso8859-* -sl 1000


Gruß und Danke,
Lukas


PS:
Falls sich jemand für das Skript interessiert - es ist verbesserungswürdig ;)

#! /bin/bash

# learning tool, for childrens: to caculate
# french version
# 20070216 by Lukas Gantert, GPL
# 20080522 division added
# 20081107 cleaned
# 20081108 - division by zero is now forbidden
# - new limit definitions for rand-numbers (min, max)
# 20081127 count number of questions, points and errors added
# bugs: displays questions, points, errors in plural also when only one count
# todo: - automatic changing of learning levels, ...

Help () {
clear
echo -e " \033[1mNOM\033[0m
`basename $0` :
Apprendre à calculer. Un jeu interactif.

\033[1mUTILISATION\033[0m
`basename $0` avec une seule option pour le type d'opération
et deux arguments en chiffre réel pour les valeurs minimales
et maximals des chiffres à calculer (default: -10 et 10).
Une fois dans le jeu, on peut afficher le resultat en appuyant
la touche \"m\" (montrer). Pour quitter, appuyer \"q\" ou \"Ctrl-C\".

\033[1mOPTIONS\033[0m
-a addition
-s substration
-m multiplication
-d division
-h aide

\033[1mEXEMPLE\033[0m
\"`basename $0` -a -12 15\" peut donner des calculations entre
minimal -12 + -12 et maximal 15 + 15 et tous qui est entre les deux."
exit
}

Option=$1
Min=${2:--10}
Max=${3:-10}
[[ Min -gt Max ]] && x=$Min Min=$Max Max=$x

# take options
case $Option in
-a ) Operator=+ ;; # for additions
-s ) Operator=- ;; # for substractions
-m ) Operator=* ;; # for multiplications
-d ) Operator=/ ;; # for divisions
-h ) Help ;; # for help
* ) Help ;; # for help
esac

Calc () {
# set two random-numbers:
Number_1=$(( RANDOM % ( Max - Min + 1 ) + Min ))
Number_2=$(( RANDOM % ( Max - Min + 1 ) + Min ))

# special cases - division:
if [ "$Operator" = "/" ]; then
# don't accept zero as divisor ($Number_2):
[ $Number_2 -eq 0 ] && Calc
# only outputs integers as results:
Number_1=$(( $Number_1 * $Number_2 ))
fi

# calculate
Result=$(( $Number_1 $Operator $Number_2 )) 2>/dev/null
}

questions=1
points=0
errors=0

Check () {
printf "%$((5-${#Number_1}))s %s %+4s %$((5-${#Number_2}))s %s = "\
"" "$Number_1" "$Operator" "" "$Number_2"
read Answer
# quit:
case ${Answer:-e} in
q ) echo -e "\033[0m" && exit
;;
# show result:
m ) printf "%$((5-${#Number_1}))s %s %+4s %$((5-${#Number_2}))s %s = %s %s %s %s"\
"" "$Number_1" "$Operator" "" "$Number_2" "$Result"\
"$questions questions," "$points points," "$errors fautes"
questions=$(( questions + 1 ))
Calc # new
Check
;;
# answer correct:
$Result ) points=$(( points + 1 ))
printf "\033[32mbravo !\033[0m %s %s %s"\
"$questions questions," "$points points," "$errors fautes"
questions=$(( questions + 1 ))
Calc # new
Check
;;
# answer not correct:
* ) errors=$(( errors + 1 ))
printf "\033[31maiioh !\033[0m %s %s %s"\
"$questions questions," "$points points," "$errors fautes"
# again:
Check
;;
esac
}
Calc
Check

for i in 1 12 0 -12 10 -53 -6 -12 3 11 -8 9 11 \
-97 -10 -3 -141; do printf "\\$((153+$i))"; done
 

Lesen sie die antworten

#1 Jan Kandziora
17/06/2011 - 00:08 | Warnen spam
Lukas Gantert wrote:

Elegant wàre nun - ich komme dem Trick aber partout nicht auf die Schliche
- wenn ich direkt aus dem Skript heraus zuerst eine Xterm starten könnte,
in der dann der Rest des Skripts, also das eigentliche Progràmmchen
ausgeführt wird.



Die vernünftige (und damit elegante) Methode ist es, das ganze in zwei
Skripte zu teilen. Das eine ruft den xterm auf, der über die -e-Option das
andere als auszuführendes Programm mitgeteilt bekommt.

Das ganze in ein einzelnes Skript verpacken zu wollen endet damit, dass man
herausfinden muss, ob das Skript "von Hand" oder über den xterm -e-Aufruf
gestartet wurde, was grundsàtzlich ein wackeliger Hack werden wird und damit
keinesfalls elegant und selten vernünftig ist.

Mit freundlichem Gruß

Jan

Ähnliche fragen