Newsgroup: it.comp.os.linux.development
Titolo: Scrivere una shell

Ciao a tutti,
sono un alunno di informatica che deve sviluppare come progetto
universitario una shell.
Il professore dopo averci spiegato a parole le syscall principali ci ha
presentato il progetto come se fosse già scritto e ha messo la data di
consegna per l'inizio di gennaio (Bel natale vero :D). Inutile dire che
durante le vacanze di Natale non sarà facile trovare un valido aiuto nei
compagni dell'uni o nel professore quindi mi rivolgo a tutti voi nel
newsgroup.
In linea di principio la shell è un programma relativamente semplice se
non fosse per un particolare (almeno dal mio punto di vista).
Il parsing della linea comandi.
Precisando che la shell dovrà supportare la redirezione dell' I/O (
<file >file 2>file ...), le pipe (|) e il quoting ( ' " ) il carattere &
 e ; come separatore di comandi; come secondo voi posso eseguire il
parsing e in quale struttura dati mi conviene salvare le informazioni
affinché siano più facilmente gestibili dai moduli che dovranno usarla??
Qualsiasi idea pratica sarà accolta con entusiasmo :D!!!
Ciao e auguri a tutti!

 ... come secondo voi posso eseguire il parsing...
yacc, lex, bison, flex

mallin.shetland ha scritto:

Ciao mallin.shetland
grazie della risposta. Lo ammetto colpa mia non ho specificato che
possiamo usare solo le librerie "standard" e non altri programmi (e
librerie associate) come quelli da te suggeriti :(
Ciao

 da te suggeriti :(
Forse lo scopo dell'esercitazione e` capire proprio 
il funzionamento di questi programmi.
Io darei una occhiata proprio alla documentazione 
di questi programmi cominciando da qui:
en.wikipedia.org/wiki/LR_parser

 il funzionamento di questi programmi.
Ciao,
Purtroppo no. Lo scopo è usare pesantemente le syscall (Si tratta del
progetto di Laboratorio di Sistemi Operativi 1) e la gestione del
parsing è diciamo "secondaria" e sicuramente anche ovvia per i nostri
professori.
Grazie mille del sito lo leggerò sperando di trovare qualche idea utile,
anticipando fra l'altro il corso del prossimo anno Linguaggi di
programmazione :p
Ciao
PS: Se qualcuno ha una soluzione più specifica io sono qua (fino al 12/1
:( )

 sicuramente anche ovvia per i nostri professori.
Vedo che il tuo problema non sta tanto nel parser 
quanto nello scanner.
Comunque implementare uno scanner non e` troppo 
difficile; sono sufficienti le funzioni standard 
del C. Io comincerei a dare un'occhiata a strtok.

 professori.
Da perfetto ignorante ... un'occhiata al codice sorgente di una shell
minimale come ash ?
-- 
http://www.alzetta.org

 minimale come ash ?
Ciao Michele
ci avevo pensato e avevo scaricato un paio di codici sorgenti ma erano
troppo "prolissi", avrei perso più tempo a cercare di capire come
funziona che ricostruirne il funzionamento.
In ogni caso proverò a scaricare ash sperando di trovare utili soluzioni :)
Ciao a tutti e auguri!!!

 universitario una shell.
Rieccomi dopo un paio di giorni di nuovo qui a chiedere un'aiutino ^^
Sto sempre scrivendo la mia shell e sono arrivato a dover fare il path
expansion; i caratteri jolly * e ^ vengono tradotti da un'apposita
funzione in una espressione regolare e passati a match() che determina
se il filename passatogli fa match, appunto, con il pattern. Oggi dopo
diverse prove arriva il messaggio di errore riportato a fine post.
La funzione regcomp che da errore è nella seguente funzione:
//from man regex.h
int match(char *string, char *pattern)
{
 	int status;
	regex_t	re;
	if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
		return -1;		/* report error */
	}
	status = regexec(&re, string, (size_t) 0, NULL, 0);
	regfree(&re);
 
	return status;
}
e l'ho appunto copiata dal manuale di regex.h presente su internet.
Qualcuno sa che tipo di errore può essere?
Grazie a tutti per il prezioso (si spera) aiuto!
Claudyus
claudyus@claddybuntu:~/Desktop/ush$ ./ush
/home/claudyus/Desktop/ush $ *.c
espansion: Regola = ^.*\.c$
espansion: main.c *matcha*
espansion: script.c *matcha*
*** glibc detected *** ./ush: malloc(): memory corruption: 0x0804b078 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7efe082]
/lib/libc.so.6[0xb7f000ca]
/lib/libc.so.6(malloc+0x86)[0xb7f01996]
/lib/libc.so.6(regcomp+0x53)[0xb7f3b013]
./ush[0x80488b7]
./ush[0x8048bce]
./ush[0x80489f9]
./ush[0x8048735]
./ush[0x80487fe]
./ush[0x8048762]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7eb08cc]
./ush[0x80486a1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 03:01 2075526
/home/claudyus/Desktop/ush/ush
08049000-0804a000 rw-p 00000000 03:01 2075526
/home/claudyus/Desktop/ush/ush
0804a000-0806b000 rw-p 0804a000 00:00 0          [heap]
b7d00000-b7d21000 rw-p b7d00000 00:00 0
b7d21000-b7e00000 ---p b7d21000 00:00 0
b7e9a000-b7e9b000 rw-p b7e9a000 00:00 0
b7e9b000-b7fb4000 r-xp 00000000 03:01 1489082    /lib/
libc-2.4.so
b7fb4000-b7fb6000 r--p 00118000 03:01 1489082    /lib/
libc-2.4.so
b7fb6000-b7fb8000 rw-p 0011a000 03:01 1489082    /lib/
libc-2.4.so
b7fb8000-b7fbc000 rw-p b7fb8000 00:00 0
b7fbe000-b7fc8000 r-xp 00000000 03:01 1485143    /lib/libgcc_s.so.1
b7fc8000-b7fc9000 rw-p 00009000 03:01 1485143    /lib/libgcc_s.so.1
b7fc9000-b7fcb000 rw-p b7fc9000 00:00 0
b7fcb000-b7fe4000 r-xp 00000000 03:01 1489079    /lib/
ld-2.4.so
b7fe4000-b7fe6000 rw-p 00018000 03:01 1489079    /lib/
ld-2.4.so
bfdff000-bfe14000 rw-p bfdff000 00:00 0          [stack]
ffffe000-fffff000 ---p 00000000 00:00 0          [vdso]
Aborted

 espressione regolare...
Sai che il globbing non e` una espressione regolare?
Sai che l'espansione dei parametri e` molto piu' 
semplice di una espressione regolare?
Sai che c'e` una funzione apposta per il globbing? 

 
NO :o
Comunque ce l'hanno consigliato i prof di usare regex per fare
l'espansione dei parametri ^^
Loro sapranno di questa funzione glob??!
Vado ad informarmi su glob e torno (tanto son solo le 23.35 :D ).
Grazie Mallin

 ...
Probabilmente no.

 ...
Probabilmente no.
PS esiste anche wordexp che espande la tilde, 
i parametri ed altre cosette.