Vediamo se riesco a postare la mia opera.....

codice:
#!/bin/sh

#
#  xstart
#
#  Copyright (c) 2003, Luigi A. Bassetti.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#


#
# Alternativa a "startx", permette di selezionare un window manager 
# come argomento del comando (esempio "xstart kde").
# Nota 1: alcuni avvertimenti di particolare importanza li ho
# scritti in maiuscolo.
# Nota 2: per i più pignoli ;-), ho usato il termine "funzione"
# per definire alcuni blocchi di codice, so che per la precisione
# avrei dovuto usare termini come "costrutto" o similari, però
# ho preferito rendere più snella la lettura dei commenti senza
# voler insistere su "precisi tecnicismi" ;-)
#
# Vorrei ringraziare l'amico Velenux del forum Linux di
# "html.it" per gli ottimi suggerimenti che mi ha dato
# nella realizzazione dei link che permettono il caricamento
# dei vari window manager con la Slackware, mentre per la
# funzione di apertura dei window manager in console virtuali
# diverse contemporaneamente ringrazio l'amico Gianluca del
# mio LUG (LinuxVar, il LUG di Varese, http://www.linuxvar.it)
# che mi ha dato l'input.
#
#

############ INIZIO DELLE VARIABILI GLOBALI ###############

#
# Il percorso degli "xinitrc" corrispondenti ai vari window
# manager
#
XINITRC_PATH=/etc/X11/xinit/xinitrc.

#
# La seguente costante contiene il nome del file "~/.xinitrc"
# salvato
#
MYXINITRC_SAVE=~/.xstart_save.xinitrc

#
# Il file "xinitrc" nella home
#
MYXINITRC=~/.xinitrc

#
# La seguente variabile conta quanti window manager sono aperti 
# nel sistema, la stessa sarà usata da più funzioni più avanti.
#
wm_counter=$((`ps --user root | grep X | grep -v grep | wc -l`))

#
# Variabile che verifica se si è in una console "tty"
#
mytty=`tty | grep tty`

#
# NOTA: ci sarà una o più variabili anche più avanti, ho cercato 
# di raggrupparle il più possibile qua per un discorso di ordine,
# però ci potrebbero essere dei casi dove risulta una scelta 
# migliore scriverle in posizioni che non compromettano 
# l'efficienza o la velocità del programma.
#


################# FINE DELLE VARIABILI GLOBALI #################

#
# Valuta se il sistema è configurato in modo da poter funzionare 
# con questo programma.
# Ho scritto xstart basandomi su Slackware 9.x
#
ls $XINITRC_PATH* > /dev/null 2>&1 
if [ "$?" != 0 ] ; then
	echo
	echo "Attenzione! Questo sistema non è adatto per l'uso"
	echo -n "di questo programma! Invio per uscire..."
	read
	echo
	exit 1
fi


#
# Viene salvato il file "~/.xinitrc"
#
if [ "$1" = "--myxinitrc-save" ] ; then
	if [ -f "$MYXINITRC_SAVE" ] ; then
		echo
		echo "Attenzione: \"$MYXINITRC_SAVE\" è già stato"
		echo -n "creato, invio per uscire..."
		read
		echo
		exit 1
	else
		echo 
		echo "Salvo il file \"$MYXINITRC\" nel file"
		echo -n "\"$MYXINITRC_SAVE\"..."
		`mv $MYXINITRC $MYXINITRC_SAVE`
		# Viene creato un link simbolico "~/.xinitrc" al file
		# salvato in quanto potrebbe succedere di usare "startx"
		# dopo avere eseguito questa opzione ma prima di avere
		# eseguito una prima volta xstart, poi serve sopratutto
		# per il fatto che lo stesso programma deve trovare un
		# link simbolico di nome "~/xinitrc" per funzionare.
		`ln -s $MYXINITRC_SAVE $MYXINITRC`
		`sleep 2`
		echo "   fatto"
		`sleep 1`
		echo
		echo "Attenzione: per ripristinare il file \"$MYXINITRC\""
		echo "originale eseguire l'opzione \"--myxinitrc-restore\""
		echo -n "o farlo manualmente, invio per uscire..."
		read
		echo
		exit 0
	fi
fi

#
# Controlla che il file "~/.xinitrc" sia un link simbolico 
# e non un file, in quest'ultimo caso chiede di eseguire 
# l'opzione "--myxinitrc-save" per salvare il file originale
# ed esce dal programma.
#

if [ ! -h "$MYXINITRC" ] && [ "$1" != "--help" ] ; then
	echo
	echo "ATTENZIONE: ESEGUIRE L'OPZIONE \"--myxinitrc-save\""
	echo "PER SALVARE IL FILE \"$MYXINITRC\" ORIGINALE, INVIO"
	echo -n "PER USCIRE..."
	read
	echo
	exit 1
fi

#
# L'opzione "-q" stampa i window manager che si possono selezionare
#
if [ "$1" = "-q" ] ; then
	echo
	echo "I window manager selezionabili sono:"
	echo
	exec ls $XINITRC_PATH* | sort | cut -d'.' -f2
	echo
	echo "per selezionarne uno digitare il nome" 
	echo "come argomento (esempio \"xstart kde\")."
	echo
	exit 0
	

#
# Opzione per controllare quanti window manager sono aperti e
# quanti se ne possono aprire ancora.
#
elif [ "$1" = "--display-counter" ] ; then
	echo
	echo "Window Manager aperti: $wm_counter"
	wm_remaining=$((6 - $wm_counter))
	if [ "$wm_remaining" -eq 0 ] ; then
		echo
		echo "Non si possono più aprire altri window manager."
		echo
		exit 1
	elif [ "$wm_remaining" -gt 0 ] && [ "$wm_remaining" -le 6 ] ; then
		echo
		echo "Window Manager che si possono ancora aprire: $wm_remaining"
		echo
		exit 0
	else
		echo
		echo "Risultano $wm_reamining window manager aperti."
		echo "Attenzione, il massimo dovrebbe essere 6, se"
		echo "sono stati aperti tutti con questo programma"
		echo "per favore segnalere la cosa a luigi.b@aliceposta.it."
		echo "Grazie :-)"
	fi

#
# L'opzione "--myxinitrc-restore" ripristina il file
# precedentemente salvato dal programma.
# Vedi anche le note sopra.
#
elif [ "$1" = "--myxinitrc-restore" ] ; then
	echo
	echo -n "Sto ripristinando il file..."
	`mv $MYXINITRC_SAVE $MYXINITRC`
	`sleep 2`
	echo "   fatto!"
	`sleep 1`
	echo
	exit 0

#
# L'opzione "--help" stampa un aiuto
#
elif [ "$1" = "--help" ] ; then
	echo
	echo -e "\n\n\033[1mxstart\033[0m  è un comando che va a sostituire startx.
	Più che sostituire sarebbe meglio dire integrare 
	in quanto alla fine viene comunque eseguito startx.

	Le opzioni possibili sono:
	
	 --help               stampa questo scritto
	
	 -q                   elenca i window manager	
	                      disponibili.	
	
         --myxinitrc-save     crea una copia di backup del
	                      file \"~/.xinitrc\" nel file
	                      \"~/.xstart_save.xinitrc\".
	                      si può ripristinare con 
	                      l'opzione \"--myxinitrc-restore\"
	
	 --myxinitrc-restore  ripristina il file \"~/.xinitrc\"
	                      originale.
	                      Se si vuole farlo manualmente
	                      bisogna rinominare il file
	                      \"~/.xstart_save.xinitrc\"
	                      precedentemente salvato dal
	                      programma sovrascrivendo il
	                      link simbolico creato da
	                      xstart.
	
	  --display-counter   Visualizza il numero dei window
	                      manager aperti e il numero di
	                      quanti se ne possono ancora aprire.
	
	L'uso è semplice, per avviare un window manager
	basta dare il suo nome come argomento (esempio:
	\"xstart kde\"), se viene dato il comando xstart
	senza argomenti verrà caricato l'ultimo window
	manager usato.
	 
	Anche la gestione dei window manager multipli è
	molto semplice, basta accedere ad una console
	virtuale non utilizzata con X e usare 
	normalmente il programma.
	L'unica accortezza nel caso che si decida di
	lanciare il programma in background, ovvero
	con l'opzione \"&\", è di usare un'altra
	console vistuale, in caso contrario il sistema
	restituirà un errore.
	Con l'opzione \"--display-counter\" si visualizza
	da qualsiasi posizione il numero di window manager
	aperti.

	Per qualsiasi problema inviare una mail a
	luigi.b@aliceposta.it

	(\"q\" per uscire)
	
	Buon divertimento... :-)" | less -r
	echo
	exit 0

#
# Crea il link simbolico allo "/etc/X11/xinit/xinitrc" 
# corrispondente al window manager selezionato.
#
elif [ -e "$XINITRC_PATH$1" ] ; then
	`ln -sf $XINITRC_PATH$1 ~/.xinitrc`
	
#
# Se il window manager indicato non esiste non verrà 
# creato nessun link, verrà chiesto se si desidera
# avviare l'ultimo window manager usato, in caso 
# contrario verrà stampato un messaggio di aiuto
# e verrà restituito il prompt dei comandi
# 
elif [ ! -z "$1" ] ; then
	echo
	echo "ATTENZIONE: \"$1\" non è un window manager presente"
	echo "nel sistema e non è un'opzione valida, digitate \"yes\"" 
	echo "e invio per avviare l'ultimo window manager usato," 
	echo "invio per visualizzare un messaggio di aiuto e" 
	echo -n "tornare al prompt..."
	read option
	if [ "$option" != "yes" ] ; then
		echo
		echo "Usate l'opzione \"-q\" per visualizzare"
		echo "i window manager disponibili o l'opzione"
		echo "\"--help\" per visualizzare le opzioni"
		echo "disponibili."
		echo
		exit 1
	fi
fi

#
# Controlla di essere in una console virtuale "tty", in 
# caso contrario stampa un messaggio di errore ed esce.
#
if [ -z "$mytty" ] ; then
	echo
	echo "Attenzione: non si può avviare un window"
	echo -n "manager da questa console, invio per uscire..."
	read
	echo
	exit 1
fi

#
# Controlla se ci sono più di 6 window manager aperti, questo 
# perchè è il massimo gestibile in modo semplice con i tasti
# Fx, comunque 6... direi che bastano!!! ;-)
# Potrebbe considerarsi una funzione poco utile visto che 
# comunque ogni window manager si può aprire da una console
# virtuale e queste al massimo sono 6, però ho preferito
# scriverla per una questione di sicurezza, non... si sa mai!!!
#
if [ "$wm_counter" -gt 6 ] ; then
	echo
	echo "Attenzione: non si possono aprire più di 6 window manager."
	echo -n "Invio per uscire......"
	read
	echo exit 1
fi

#
# Variabile contenente i numeri dei display aperti. Ho deciso di
# scriverla qua in quanto rallenta leggermente l'esecuzione del
# programma e a volte si ha solo bisogno di usare xstart per una
# opzione.
#
DISPLAY_OPENED=`ps --user root l | grep 'X :' | grep -v grep | cut -d: -f3 | cut -c1 | sort`

#
# Funzione per determinare il primo display disponibile (su 6).
#
for display in "0" "1" "2" "3" "4" "5" ; do
	for counter in 1 2 3 4 5 6 ; do
		# Divide i numeri dei display uno a uno
		display_test=`echo $DISPLAY_OPENED | tr -d " " | cut -c$counter`

		# Se "display" trova una corrispondenza con "display_test" 
		# allora il numero contenuto in display corrisponde a un 
		# numero di display occupato, assegna una stringa nulla
		# a "display" (che sevirà anche al ciclo esterno) ed esce 
		# dal ciclo.
		if [ "$display" = "$display_test" ] ; then
			display=""
			break
		fi
	done
	# Se "display" non contiene una stringa nulla allora non c'è
	# una corrispondenza con il relativo display aperto, questo
	# vuol dire che si può aprire questo display.
	if [ ! -z "$display" ] ; then
		break
	fi
done

#
# Funzioni per avvertire che c'è già uno o più window manager aperto,
# visualizzare quanti ne sono aperti e opzione per continuare o uscire.
#
if [ "$wm_counter" -ge 1 ] ; then
	if [ "$wm_counter" -eq 1 ] ; then
		echo
		echo "Attenzione: c'è già un window manager aperto, se si vuole"
		echo "continuare premere invio, altrimenti digitare 1 e invio"
		echo "per uscire."
	else
		echo
		echo "Attenzione: ci sono già $wm_counter window manager aperti, se si"
		echo "vuole continuare premere invio, altrimenti digitare 1 e invio"
		echo "per uscire."
	fi
	echo "Nel caso si continui, per accedere a questo window manager"
	echo "da un'altro window manager o una console usare la combinazione"
	echo "di tasti Ctrl+Alt+Fx in cui x è un tasto compreso tra \"F7\" e"
	echo -n "\"F12\"............"
	read option
	if [ "$option" -eq 1 ] ; then
		echo
		exit 1
	fi
	`startx -- :$display`
	exit 0
else
	`startx`
	exit 0
fi