Shell: Parte 2 (Soluzioni)ΒΆ

  1. Soluzioni:
    1. mkdir informatica. Verifico che sia vuota con ls informatica.
    2. mkdir esercizi.
    3. cd informatica. Verifico con pwd.
    4. mv ../esercizi ../esercizi-shell. Verifico con ls ...
    5. cp -r ../esercizi-shell .. Verifico con ls.
    6. rm -r ../esercizi-shell.
    7. echo 'esercitazioni di informatica' > esercizi-shell/README. Verifico con cat esercizi-shell/README.
    8. echo 'Parte 1, introduzione alla shell' >> esercizi-shell/README. Idem.
    9. cd.
  2. Soluzioni:
    1. mkdir original, seguito da echo '*' > original/a.

    2. Per comodita’, entro in temp con cd temp. Dopo ogni passaggio, faccio:

      cd ..
      rm -r temp
      cp -r original temp
      cd temp
      

      Soluzioni:

      1. cp a b; cp a c. Verifico con ls; cat b; cat c.

      2. echo a stampa la stringa “a” a schermo; ls a stampa il nome del file a (che e’ a...); cat a stampa il contenuto del file a, cioe’ le due righe che abbiamo scritto prima.

      3. Nessuna. mv a b rinomina a in b. cp a b; rm aa prima fa prima una copia di a chiamata b, poi rimuove a.

      4. Nel primo caso mi ritrovo con tre copie di a, nel second con un solo file: c.

      5. mv a z rinomina a in z; quindi z e’ un file. mkdir z; mv a z prima crea una directory z, poi ci mette dentro a.

      6. echo a z stampa a schermo la stringa a z. mkdir z; echo a z fa la stessa cosa, ma crea anche una directory di nome z.

      7. Cosi’:

        echo qualcosa > a1
        ...
        echo qualcosa > a10
        rm a*
        
  3. Soluzioni:
    1. Da’ errore. -e non e’ un’opzione valida per ls.
    2. Si pianta. cat si aspetta un file di input: noi non glielo diamo, e lui resta in attesa. Dato che cat e’ fermo, il resto della pipeline resta in attesa. Siamo costretti ad uccidere la pipeline con Control-c.
    3. Da’ errore. . e’ una directory, cat si aspetta un file.
    4. Stampa la stringa “cat” a schermo. (Non esegue il comando cat...)
    5. Stampa il contenuto del file a (se esiste), ma visto che lo stdout e’ rediretto, mette l’output di cat nel file b. E’ equivalente a cp a b.
    6. Da’ errore: << non e’ un operatore di redirezione valido.
    7. Non ha senso: stiamo cercando di redirigere lo stdout di head sia verso il file a che, con la pipe |, verso lo stdin di tail.
    8. ls mette in a la lista dei file nella directory corrente; fin qui tutto ok. Mai rm non supporta la redirezione, si aspetta invece il nome di un file! Quindi finisce per dare errore.
    9. Scrive il testo “KrustyIlKlown” nel file a.
    10. Il primo tac legge FILE1 lo stampa a schermo rovesciato; pero’ la pipe ne redirige lo stdout al secondo tac: l’effetto complessivo e’ che FILE1 viene stampato a schermo nel verso giusto. Infine, l’ultimo > mette il contenuto di FILE1 in FILE2. Il tutto e’ equivalente a cp FILE1 FILE2.
  4. Soluzioni:
    1. Stampa le prime dieci righe di a in b.
    2. Idem.
    3. Idem.
    4. Stampa le ultime dieci righe di a in b.
  5. Soluzioni:
    1. Stampa a sottosopra, prende le prime venticinque righe, le mette in b. Quindi b contiene le ultime venticinque righe di a sottosopra.
    2. Stampa a, prende le ultime venticinque righe, le mette in b. Quindi b contiene ultime venticinque righe di a ma non sottosopra.
  6. Soluzioni:
    1. Stampa le prime dieci righe di a.
    2. Mette le prime dieci righe di a nel file temp, poi stampa le ultime dieci righe di a.
  7. Soluzioni:
    1. Stampa file e ne tiene solo le prime dieci righe.
    2. Si pianta. Come sopra, cat si aspetta un file in input; non non glielo diamo e lui resta in attesa.
  8. Soluzioni:
    1. Stampo le prime n del file, di queste tengo solo l’ultima: head -n n file | tail -n 1.
    2. Assumiamo che tot=n+m. Stampo le ultime tot righe del file, di queste tengo solo le ultime m: head -n tot file | tail -n m.
  9. Soluzioni:
    1. Eseguo:

      head -n 50 data/a | tail -n 25 > data/b
      head -n 25 data/a >> data/b
      tail -n 50 data/a >> data/b
      
    2. Come sopra, ma il secondo comando diventa:

      head -n 25 data/a | tac >> data/b