#!/bin/bash # elegir_entorno # Menú para elegir el entorno de trabajo. (shicefgo@fentlinux.com). # # Este script es software libre y no tiene NINGÚN TIPO DE GARANTÍA. # Véase la licencia GPL para más detalles. # Variables utilizadas. DISPONIBLES=6 # El mayor de los números de las opciones. ELECCION='1' # La opción tecleada por el usuario. SESION=0 # Controla la sesión gráfica. Cero, no; uno, sí. ENTORNO= # El entorno que se quiere ejecutar. EJECUTABLE= # Nombre del ejecutable, PATH incluído. ULTIMO= # Último entorno gráfico llamado a través de este script. NUM_SESIONES= # Número de sesiones gráficas iniciadas. # Se limpia la pantalla, se muestra el menú, y se lee la elección introducida # por el usuario. function menu() { clear echo echo "Elección del entorno de trabajo." echo echo "ELIJA UNA DE LAS SIGUIENTES OPCIONES:" echo echo " 0. (Intro) Lanzar el último entorno gráfico utilizado. "$ULTIMO echo " 1. Consola de texto (la shell)." echo " 2. Xfce4." echo " 3. Window Maker." echo " 4. GNOME." echo " 5. KDE." echo " 6. Fluxbox." echo echo -n "Elección: " read ELECCION } # Se crea un nuevo archivo .xinitrc sobrescribiendo el que pueda existir. # El carácter '>' sustituye el archivo entero por lo que tenga a su izquierda. # Los caracteres ">>" añaden líneas al archivo. function nuevo_xinitrc() { echo "#!/bin/bash" > ~/.xinitrc echo "#" >> ~/.xinitrc echo "# Archivo .xinitrc" >> ~/.xinitrc echo "# Creado por el script /usr/local/bin/elegir_entorno" >> ~/.xinitrc echo "#" >> ~/.xinitrc } # Se comprueba que el archivo .xinitrc existe en el HOME del usuario y que # sea un archivo regular, no un enlace simbólico (-f). # Si el archivo existe, se busca en él la cadena "Entorno" y, si esta también # existe, se captura la primera palabra de la línea que la contiene, que será # el nombre del entorno anteriormente grabado. # Si no existe la cadena "Entorno", ULTIMO tomará un valor nulo (""). if [ -f ~/.xinitrc ]; then ULTIMO=$(cat ~/.xinitrc | grep "Entorno" | cut -d' ' -f1) fi # El bucle while se ejecutará mientras no se introduzca un valor válido y/o el # entorno elegido no esté en el PATH del usuario. while [ $ELECCION ]; do menu case $ELECCION in $RETURN) SESION='1' break ;; '0') SESION='1' break ;; '1') break ;; '2') ENTORNO="xfce4-session" ;; '3') ENTORNO="wmaker" ;; '4') ENTORNO="gnome-session" ;; '5') ENTORNO="startkde" ;; '6') ENTORNO="startfluxbox" ;; esac # Busca el entorno elegido en las rutas del PATH del usuario. EJECUTABLE=$(which $ENTORNO) # Si EJECUTABLE contiene un valor no-nulo, es que todo va bien y se # puede cargar el entorno elegido. if [ "$EJECUTABLE" != "" ]; then SESION='1' nuevo_xinitrc # Una vez comprobado que el entorno elegido está disponible, se # pueden incluir en ~/.xinitrc algunas aplicaciones que deseemos # tener disponibles al iniciar determinados gestores gráficos. # Han de ser iniciadas en segundo plano, con el carácter '&'. # Un par de ejemplos, con algunas líneas comentadas: case $ELECCION in '2') # Entorno Xfce4: # echo "gkrellm &" >> ~/.xinitrc # echo "mozilla-firefox &" >> ~/.xinitrc echo "xscreensaver &" >> ~/.xinitrc ;; '3') # Entorno Window Maker: # echo "gkrellm &" >> ~/.xinitrc echo "xplanet -projection rectangular -vroot &" >> ~/.xinitrc echo "xscreensaver &" >> ~/.xinitrc ;; esac # Se completa el archivo ~/.xinitrc y se sale del bucle while. echo $ENTORNO" # Entorno gráfico a ejecutar." >> ~/.xinitrc break # Si el valor de EJECUTABLE es nulo, se muestra un aviso, en su caso, y se # regresa al menú. else if [ $ELECCION -le $DISPONIBLES ] && [ $ELECCION -ge '0' ]; then echo echo "No encontrado "$ENTORNO" en el PATH." echo -n "Pulse Intro para continuar... " read ENTORNO fi fi done # Captura el número de veces que xinit ha sido cargado, o, lo que es lo # mismo, el número de sesiones gráficas en funcionamiento. # Si la captura fallara, NUM_SESIONES toma el valor 0 para que sea posible # iniciar la primera sesión. NUM_SESIONES=$(ps -e | grep -c xinit) if [ "$NUM_SESIONES" == "" ]; then NUM_SESIONES=0 fi # Si no hay sesión gráfica iniciada se arranca la sesión por defecto, pero si # ya existen procesos llamados "xinit", se arranca otra sesión, que puede ser # tanto la segunda como una tercera, o una cuarta... depende de la RAM ;-). if [ $SESION == '1' ]; then if [ $NUM_SESIONES == '0' ]; then startx else startx -- :$NUM_SESIONES fi fi # Fin del script.