Newsgroup: it.comp.lang.c
Titolo: linux - shell minimale

salve, avrei una curiosita'...
E' possibile scrivere una shell minimale con poche righe?
Per minimale intendo semplicemente un loop infinito in cui legge in 
input una stringa, e la esegue come fosse un comando. Nessun'altra 
funzionalita'.
Pero' vorrei poterla avviare in un sistema minimo, in cui c'e' solo 
glibc... senza bash.
Diventa complicato?


glibc di per se e' una grossa dipendenza. Ci sono alternative piu'
minimalistiche se proprio vuoi (diet libc per esempio)
Comunque la libreria non c'entra nulla con la shell di avvio.
Se tu vuoi, puoi cambiare il programma che viene eseguito dal prompt
di login. Invece di bash invochi la tua shell. In quel modo ci pensa
il programma login ad eseguire il tuo programma, non bash.

Per fare in modo di scrivere meno codice possibile per gestire il
prompt dei comandi, sarebbe utile utilizzare una delle librerie gia'
pronte, come GNU readline
http://tiswww.case.edu/php/chet/readline/rltop.html
Il vantaggio e' che non ti devi preoccupare troppo di come ottenere
l'input dell'utente, ma ti preoccupi solo di processare i comandi.
Ovviamente, se tu vuoi specializzarti nella lettura di input (che puo'
provenire non solo dal terminale) direi che sarebbe utile una lettura
generale del codice di readline.

Questa e' la documentazione base di readline, e di come usarla
all'interno del proprio programma:
http://tiswww.case.edu/php/chet/readline/readline.html#SEC23

 il programma login ad eseguire il tuo programma, non bash.
io per la verita' cercavo una shell di veramente meno di 10 righe... 
ammesso che la cosa sia possibile...
una cosa tipo:
#include <stdio.h>
while(1)
{
   printf("\n>");
   scanf("%s", &comando);
   *exec(comando);*
}
In un sistema in cui non e' installata bash, dove in inittab scriverei 
una cosa tipo:
xx:2345:respawn:/bin/minishell
La curiosita' mi e' nata dopo aver visto in funzione un simpatico 
bootloader che semplicemente scriveva HelloWorld sul video... volevo 
semplicemente ampliare il giochino con la shell, ma se e' troppo 
complicato o strano non importa... grazie lostesso


capisco... credevo scanf fosse sufficiente per leggere l'input...
direi che non sono all'altezza della cosa... peccato
ma grazie, ovviamente

Scanf e' _sufficiente_, ma _inefficiente_
Una shell minimale deve essere in grado di non compromettere il
terminale dell'utente, tutto li.

 funzionalita'.
...di getto, non testato...
#include <ctype.h>
#include <stdio.h>
#include <string.h>
char *env[]={0};
int main() {
	char line[256];
	char *args[64];
	for(;;) {
		char *p;
		int n;
		fgets(line,sizeof(line)-1,stdin);
		n=0;
		p=line;
		while (isspace(*p)) p++;
		if (*p)
			args[n++]=p;
		while (*p) {
			if (isspace(*p)) {
				*(p++)=0;
				while (isspace(*p)) p++;
				args[n++]=p;
			} else {
				p++;
			}
		}
		if (!strcmp(args[0],"exit")) {
			return 0;
		} else if (!strcmp(args[0],"cd")) {
			/* da implementare */
                 } else if (!strcmp(args[0],"pwd")) {
			/* da implementare */
			/* ... */
		} else {
			/* da fare: */
			/* mettere almeno CWD e PATH nell'environment */
			/* ... cercare l'eseguibile nel PATH ... */
 
			pid_t pid;
			pid = fork();
			if (pid == 0) {
  			  execve(args[0],args,env);
			} else if (pid>0) {	
			  wait(0);
			}
		}
  	}
}


ti ringrazio molto... l'unica cosa che non capisco bene, e' il fatto che 
si passi l'environment al sistema operativo... credevo fosse affare 
della shell gestire le variabili d'ambiente... ma ovviamente devo 
leggere il fuck-manual, quindi non tediero' oltre... mi salvo la mail e 
ci pasticcio un po' su...
molte grazie, ovviamente