#!/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. declare -a DISPONIBLES # Vector (array) para los entornos a elegir. 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 desde este script. NUM_SESIONES= # Número de sesiones gráficas iniciadas. CONTADOR= # Cuenta los entornos disponibles. # 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 CONTADOR=0 while [ "${DISPONIBLES[CONTADOR]}" != "" ]; do echo " $CONTADOR. ${DISPONIBLES[CONTADOR]}" let CONTADOR+=1 done 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 if [ "$ULTIMO" == "" ]; then ULTIMO="Desconocido" fi # Para añadir entornos, basta incluir el nombre del ejecutable después del # último de la lista (y antes del paréntesis de cierre), terminado en un # espacio más una barra inversa " \". Las comillas dobles son para incluir en # la misma línea más de una palabra separadas por espacios. # DISPONIBLES=(\ "Último entorno gráfico utilizado ($ULTIMO)" \ "Consola de texto (la shell)" \ xfce4-session \ wmaker \ gnome-session \ startkde \ startfluxbox \ fluxbox \ ) # 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 if [ "$ELECCION" == "$RETURN" ] || [ "$ELECCION" == "0" ]; then SESION='1' break elif [ "$ELECCION" == "1" ]; then break fi ENTORNO=${DISPONIBLES[$ELECCION]} # 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 $ENTORNO in 'xfce4-session') # echo "mozilla-firefox &" >> ~/.xinitrc # echo "gkrellm &" >> ~/.xinitrc echo "xscreensaver &" >> ~/.xinitrc ;; 'wmaker') # 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 entorno elegido no se ha encontrado, se muestra un aviso y se # regresa al menú. else if [ $ELECCION -lt ${#DISPONIBLES[*]} ] && [ $ELECCION -ge '0' ]; then echo echo "No encontrado $ENTORNO en el PATH." echo -n "Pulse Intro para continuar... " read 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.