shell skript..

ludi

Well-Known Member
huhu, geht hier um ein shell skript, dass mir beim ausführen von 'startx' durch einen switch() befehl eine liste von möglichen x11 clienten wiedergibt.

da die datei '.xinitrc' durch den befehl 'startx' ja (laut manuals) wie ein shell skript behandelt wird fehlt mir jetzt der entscheidende befehl bei der switch() anweisung:

wie frage ich die eingabe des benutzers in der commando zeile / console ab?

also perl und C und C++ realisieren das ziemlich einfach... wisst ihr ja,
und wie nun bei shell?

pipe?

switch(<$1) ... ???

danke für hilfe, ich poste das skript dann auch mal oder vielleicht habt ihr so etwas ähnliches schon geschrieben...

es geht mir einfach darum, dass ich manchmal keinen bock auf KDE habe, weil es mir zu lange dauert zu laden. und dann editiere ich nicht jedesmal die .xinitrc sondern will das über ein auswahlmenu steuern...
 
habs...

Code:
#!/bin/csh

echo "***********************************************************"
echo "a -- KDE"
echo "b -- GNOME"
echo "c -- TWM (default)"
echo "***********************************************************"

set i = $<

switch ($i)
	case a:
	exec startkde

	case b:
	exec gnome-session
	
	default:
	exec twm
endsw

ist nicht viel dran an dem knochengeruest, naja letzte woche hat mir der computer gefehlt und hab heute die richtige syntax (zumindest mal c-shell) gefunden...

wenn ihr den code in die '.xinitrc' datei einfuegt, bietet sich ein menu mit welchem ihr bequem die einzelnen X clienten ansteuern koennt!

ob's sowas schon gibt oder nicht, ka, mir ist es halt noetig erschienen...da ich doch sehr oft mal kein bock auf das lange laden von KDE habe, wenn nicht gerade alle 100 multimedia apps benutzt werden muessen, die KDE so bietet.

also da ich gerade unter KDE arbeite, kann ich noch nicht 100% sagen, dass es funktioniert, aber:

lambda# csh .xinitrc_
***********************************************************
a -- KDE
b -- GNOME
c -- TWM (default)
***********************************************************

twm: another window manager is already running on screen 0?
twm: unable to find any unmanaged screens

sieht doch so aus, als ob es funktioniert...

:)
 
Zuletzt bearbeitet:
mhh...ne, bitte noch nicht anwenden...

das darf kein c-shell skript sein ... hmmm, mal darueber schlafen,
bubu
 
Hallo,

eine frage: ist dies auch ohne weiteres bei der 5.3 möglich?

grüße
 
Oder wenn es in der Shell bleiben soll per `dialog'
#!/bin/sh
dialog --title "Select your WM" \
--radiolist "Which wm should be started?" 16 60 5\
"startkde" "KDE" on \
"gnomesession" "GNOME" off \
"pekwm" "PekWM" off \
"fluxbox" "Fluxbox" off 2> /tmp/dialselect

WM=$(cat /tmp/dialselect);
rm /tmp/dialselect
clear

if [ -z $WM ]
then
echo "User aborted...";
exit 1
else
echo "Starting $WM ..."
exec $WM
fi

So sachen wie pekwm, fluxbox, etc.. muesste man vielleicht auf exec startx -- :0 /path/to/$WM-script umschreiben..
 
sebbo schrieb:
WM=$(cat /tmp/dialselect);

Abgesehen davon das es nicht Bourneshell-kompatibel ist, wuerde ich das ehrlich gesagt nicht verwenden. Schonmal darueber nachgedacht was passiert, wenn jemand die /tmp/dialselect mit Globber durch ueberschreiben schuetzt, nachdem er dort ein "rm -rf /" plaziert hat?

http://www.bsdforen.de/showthread.php?t=4388 halte ich auch nicht fuer sonderlich sinnvoll, weil da jedesmal die ~/.xinitrc ueberschrieben wird. Was spricht dagegen eine einfache case-Abfrage direkt in die ~/.xinitrc einzubauen, die es erlaubt den Windowmanager ueber einen Parameter anzugeben oder von STDIN zu lesen?
 
strcat schrieb:
Abgesehen davon das es nicht Bourneshell-kompatibel ist, wuerde ich das ehrlich gesagt nicht verwenden.
Well.. Dann halt einfach noch ein Leerzeichen in der dritten Zeile zwischen 5 und \ platzieren ;)

Schonmal darueber nachgedacht was passiert, wenn jemand die /tmp/dialselect mit Globber durch ueberschreiben schuetzt, nachdem er dort ein "rm -rf /" plaziert hat?
Was haette er davon? ;)

Was spricht dagegen eine einfache case-Abfrage direkt in die ~/.xinitrc einzubauen, die es erlaubt den Windowmanager ueber einen Parameter anzugeben oder von STDIN zu lesen?
Gar nichts, aber ich finde `dialog' einfach schoener. Jedem das Seine. ;)
 
sebbo schrieb:
Well.. Dann halt einfach noch ein Leerzeichen in der dritten Zeile zwischen 5 und \ platzieren ;)

Es ist trotzdem nicht Bourneshell-kompatibel, weil die keine $(foo) als Kommandosubstitution ararbeiten kann.

Was haette er davon? ;)
Eine Menge Platz. Guckst Du:
Code:
[dope@painless:~]% echo uname > /tmp/dialselect
[dope@painless:~]% chmod -w /tmp/dialselect
[dope@painless:~]% ./foo.sh 
./foo.sh: line 2: /tmp/dialselect: Permission denied
rm: remove write-protected regular file `/tmp/dialselect'?
y
./foo.sh: line 13: [: uname: binary operator expected
Starting uname ...
OpenBSD

Gar nichts, aber ich finde `dialog' einfach schoener. Jedem das Seine. ;)

Correct, aber das oben genannte Script ist mehr als schwere Koerperverletzung. Wenn schon das obige Konstrukt, dann sollte man wenigistens die Datei "dialselect" da erstellen, wo sie nur der User lesen/schreiben kann; also z. B.
Code:
#!/bin/sh
....
"fluxbox" "Fluxbox" off 2> ${HOME}/dialselect
WM="`cat /tmp/dialselect`;
...
 
Mh.. Ok. Da muss ich dir recht geben.

strcat schrieb:
Es ist trotzdem nicht Bourneshell-kompatibel, weil die keine $(foo) als Kommandosubstitution ararbeiten kann.
Da komm ich nicht ganz mit. Also $() klappt bei mir zumindest unter der bash/csh/ksh.
> echo $0
bash
> TEST=$(uname)
> echo $TEST
OpenBSD
Gibt es noch mehr Shells, die $() nicht verstehen?
 
Die /bin/sh von SunOS 5.7, IRIX, Tru64, .. Da wird ein
Code:
$ foo=$(expr 23 + 42)
mit einem "syntax error: `foo=$' unexpected" beantwortet.
Laut IEEE Std 1003 ist zwar beides gueltig, aber nur theoretisch :/
 
War nur als Beispiel gedacht, aber es zeigt mal wieder, wieso man die CSH nicht verwenden will. Whatever .. fuer Berechnungen nehm ich dc(1), bc(1) oder zsh/mathfunc der Zsh:
Code:
dope@painless:~% echo $(( sin(1/4.0)**2 + cos(1/4.0)**2 - 1 ))
zsh: unknown function: sin
dope@painless:~% zmodload zsh/mathfunc
dope@painless:~% echo $(( sin(1/4.0)**2 + cos(1/4.0)**2 - 1 ))
-1.1102230246251565e-16
dope@painless:~%
 
sebbo schrieb:
Da komm ich nicht ganz mit. Also $() klappt bei mir zumindest unter der bash/csh/ksh.

Ja, aber hier ist nicht bash/csh/ksh sondern sh gemeint ! Nach Möglichkeit sollte man in Skripten keine Spezialfunktionen von Shells benutzen sondern auf strikte Kompatibilität zur Bourne-Shell achten.
 
Zurück
Oben