PDA

View Full Version : Aiutatemi a preparare il mio esame


:.Blizzard.:
17-07-2007, 23:33
Salve a tutti, a giorni dovrei sostenere un esame di UNIX e avrei bisogno di una mano nello svolgere alcuni esercizi che posterò di seguito con i miei dubbi. Se avete un pò di pazienza per starmi dietro per risolvere questi semplici quesiti (vi chiedo un minuto del vostro tempo :cry: ) avrete la mia eterna gratitudine :sofico:

Parto dal primo esercizio:

1) Scrivere una command line, utilizzando | , che stampi il numero di sottodirectory della directory corrente

Io ho provato con :

ls -R | wc -l

Ma l'istruzione ricorsiva "ls-R" mi conta anche i files oltre che le sottodirectory. Qualche soluzione?

_______________________

2) Descrivere la differenza dei seguenti script da Bourne Shell:
a) $sh script
b) $. script


Non sono la stessa cosa? o.O Considerando che l'esecuzione di uno script da bash avviene mettendo "." davanti al nome del file?

Davide.Prina
18-07-2007, 08:31
1) Scrivere una command line, utilizzando | , che stampi il numero di sottodirectory della directory corrente


$ ls -lR | grep ^d | wc -l


2) Descrivere la differenza dei seguenti script da Bourne Shell:
a) $sh script
b) $. script


in una normale installazione i due comandi sono equivalenti. Entrambi ritornano come risultato un errore, anche se è un po' differente.

Per verificarlo
$ echo 'echo "Ciao"'> script
$ chmod u+x script

$ sh script
/usr/bin/script: /usr/bin/script: cannot execute binary file
dprina@localhost:~$ . script
bash: ELF: command not found

Nota: l'errore che ritorna ". script" è dovuto al fatto che script è un comando. Vedere. $ man script

Per verificare che lo script creato funzioni:
$ ./script
Ciao

Questo perché di default in ogni installazione GNU/Linux e Unix la directory corrente non è mai inclusa nel path ... ed includerla comporta un rischio di sicurezza.

Se eseguo:

1) $ ./script
eseguo lo script nella directory corrente utilizzando l'interprete dei comandi corrente

nel mio caso:
$ echo $SHELL
/bin/bash

2) $ script
eseguo lo script nel path ($ echo $PATH) utilizzando l'interprete dei comandi corrente

3) $ sh script
chiama l'interprete sh per l'esecuzione dello script (non è necessario che lo script abbia i permessi di esecuzione) utilizzando sh come interprete dei comandi.

Eseguo lo script nella directory corrente

Quindi se eseguo

$ echo 'echo "Ciao"'> script1
$ ./script1
bash: ./script1: No such file or directory
$ sh script1
Ciao

Notare che l'istruzione così creata dipende molto da cosa è "sh"
$ type sh
sh is hashed (/bin/sh)
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 2006-12-18 20:18 /bin/sh -> bash

Quindi su un'installazione GNU/Linux sh di default punta a bash

Chiamando sh in realtà si chiama bash.
Bisogna stare attenti che chiamando sh si disabilitano le estensioni specifiche di bash e quindi si potrebbe avere, come conseguenza, che lo script non funzioni correttamente.

4) $ . script
il comando . è un built-in di bash e altre shell ed equivale al comando source

5) $ source script

Il comando source permette:
I) se è all'interno di uno scritp: di includere il file indicato
II) se è usato sulla riga di comando: di eseguire lo script

Eseguo lo script prima cercandolo nel $PATH e se non lo trova nella directory corrente

le differenze rispetto agli altri metodi di esecuzione di un comando sono:
a) non apre una nuova shell per l'esecuzione, ma esegue in quella corrente
Per capire questo faccio un piccolo esempio
$ PIPPO=1
$ echo $PIPPO
1
$ sh
$ echo $PIPPO

$ exit
exit
$ echo $PIPPO
1

come puoi vedere aprendo una nuova shell (comando "$ sh")entro in un ambiente totalmente diverso e a sé stante e ritorno alla shell precedente con il comando exit.
Eseguendo uno script nelle modalità elencate nei punti 1-4 in pratica viene aperta una nuova shell dove viene eseguito lo script. E alla terminazione dello script ritorna alla shell precedente

b) come conseguenza di a) è possibile far ritornare un valore allo script con il comando "return" perché la shell resta sempre la stessa

c) se è eseguito all'interno di uno script (source script), allora il controllo ritornerà allo script che l'ha chiamato appena l'esecuzione sarà terminata

d) nello script ci deve essere indicato come eseguire lo script stesso e questo si ricava dalla prima riga, ad esempio:
#!/bin/bash

6) $ sh < script1
Questa istruzione è simile a "$ sh script1" con l'unica differenza che viene disabilitata la lettura dallo standard input

Eseguo lo script nella directory corrente




Penso di aver detto più o meno tutto ... almeno tutto quello che conosco a riguardo.

Ciao
Davide

:.Blizzard.:
18-07-2007, 15:57
grazie, sei stato gentilissimo. Ora leggo con calma e cerco di capire. Se non ti dispiace più in là magari posto altri esercizi se hai voglia di darmi una mano - puoi essere anche più generico e riassuntivo, non importa - te ne sarei grato.

Ciauuu

verde_acqua
18-07-2007, 16:57
siccome forse stiamo preparando lo stesso esame, posto alcune domande (penso pertineti al topic)

ho cercato nel file system delle librerie generiche
e mi è sembrato che tutte hanno avessero estensione .h, è così?

per librerie generiche intendo collezione di funzioni, prototipi ed altro

Davide.Prina
19-07-2007, 12:23
sbagliato.
I .h sono gli header e non le librerie.
Gli header permettono di creare programmi che poi, nella fase di link, utilizzano le librerie.

Le librerie le trovi, ad esempio, sotto /usr/lib
L'estensione di solito è .so, so.X.Y..., .a, .la, ...

In generale le librerie possono essere statiche o dinamiche: le prime vengono incluse all'interno dell'eseguibile, mentre le seconde sono chiamate al momento dell'esecuzione (di solito è usato quest'ultimo metodo).

Ciao
Davide

:.Blizzard.:
19-07-2007, 13:49
Scrivere uno script in C shell che riconosca se la prima opzione della riga di comando che la richiama è "-A" oppure "-B".
Lo script ha come primo argomento una opzione e come secondo un file. Se l'opzione è -A , lo script deve controllare il numero di linee del file che iniziano con la lettera A, se l'opzione è -B deve stampare le caratteristiche del file.


#!/bin/csh
if(($argv[1]=="A" || $argv[1]=="a")) then
grep A $argv[2] | wc -l
endif
else if (($argv[1]=="B" || $argv[1]=="b")) then
ls -l $argv[2] >> filestampa
lpr filestampa
endif
else echo "opzione inesistente"



So' di aver fatto un disastro ... ma non so proprio metterci mano. Oltretutto, coma faccio a chiamare uno script da riga di comando passandogli argomenti? (in questo caso A o B) :muro: :cry:

verde_acqua
20-07-2007, 15:34
sbagliato.
I .h sono gli header e non le librerie.
Gli header permettono di creare programmi che poi, nella fase di link, utilizzano le librerie.

Le librerie le trovi, ad esempio, sotto /usr/lib
L'estensione di solito è .so, so.X.Y..., .a, .la, ...

In generale le librerie possono essere statiche o dinamiche: le prime vengono incluse all'interno dell'eseguibile, mentre le seconde sono chiamate al momento dell'esecuzione (di solito è usato quest'ultimo metodo).

Ciao
Davide


:doh: vero mi ero confuso perchè gli header che vedevo si chiamavano tutti xxx.h dove xxx era il nome della libreria.
Grazie per la risposta:)

Davide.Prina
20-07-2007, 20:32
[quote]
Scrivere uno script in C shell che riconosca se la prima opzione della riga di comando che la richiama è "-A" oppure "-B".
Lo script ha come primo argomento una opzione e come secondo un file. Se l'opzione è -A , lo script deve controllare il numero di linee del file che iniziano con la lettera A, se l'opzione è -B deve stampare le caratteristiche del file.

#!/bin/csh
if(($argv[1]=="A" || $argv[1]=="a")) then
grep A $argv[2] | wc -l
endif
else if (($argv[1]=="B" || $argv[1]=="b")) then
ls -l $argv[2] >> filestampa
lpr filestampa
endif
else echo "opzione inesistente"
[quote]

non conosco csh

1) se l'opzione deve essere -A o -B, allora quando fai il confronto devi tenere conto anche del -
2) nel grep devi controllare che le righe inizino per A e non che contengano A
3) secondo me hai sbagliato nell'impostazione del costrutto if ... then ... else
4) secondo me hai sbagliato i confronti
5) non ho capito perché ridirigi l'output in append e non usi invece una pipe

ma hai provato ad eseguire il tuo script?
Le cose le devi capire e quando sviluppi fai per gradi, un pezzo per volta e lo provi per vedere se funziona.

Ciao
Davide

:.Blizzard.:
21-07-2007, 00:22
Leggo solo ora la risposta. Grazie. Stamattina cmq ho studiato meglio la csh e sono riuscito a fare lo script da me e a farlo partire correttamente da linea di comando ;)