Ciao a tutti...
Avrei bisogno di alcuni chiarimenti (sarebbero graditi anche esempi) su queste cose qua:
- che differenza c'è tra l'uso dei `` e il | ma anche del >> o ancora di usare una subshell (...)
Premetto che non conosco il tuo livello di preparazione, se dico cose che ti sembreranno ovvie è per questo

`foo` esegue foo in una subshell e spedisce l'output direttamente alla shell superiore.
Esempi:
$ `find /usr -name xlogo`
Viene eseguito find che, appena trova xlogo, restituisce alla shell superiore l'output (generalmente /usr/bin/xlogo), che viene eseguito e quindi parte l'applicazione. Sostanzialmente è come se al posto di `...` avessi scritto direttamente il risultato.
$ file `which editor`
Qui viene eseguito prima di tutto il comando `which' in una subshell e l'output viene "rispedito" indietro, in questo caso viene passato come argomento a `file'. Per il resto è uguale all'esempio precedente.
Un sinonimo di `foo` è $(foo). Entrambi sono comandi di sostituzione.
| è una pipe, serve a reindirizzare l'output di ciò che è a sinistra verso l'input di quello che è a destra.
Esempio:
$ cat foo.txt | less
L'output di cat viene passato all'input di less.
Attento a non usare la pipe per passare _argomenti_, es:
$ ls /etc/inittab | file
Questo è sbagliato, perché `file' non legge dallo stdin, in questo caso può essere utile o usare i comandi di sostituzione oppure `xargs', es:
$ ls /etc/inittab | xargs file
Questo funziona, l'output di ls viene passato, grazie a xargs, come argomento a file.
L'operatore `>>' redirige l'output di ciò che è a destra sul nome del file alla sinistra, inserendo però i dati _alla fine_ del file.
Se il file non esiste o è vuoto si comporta esattamente come `>'.
Le subshell sostanzialmente creano un nuovo ambiente, quindi le variabili della subshell sono "locali", cioè non sono visibili dalla shell genitrice.
Esempio:
> x=0
> ( x=3 )
> echo $x
0
- che differenza c'è tra i ":" e /dev/null
Se devi ignorare un determinato output non puoi redirigerlo verso ":", se invece vuoi creare un file vuoto non fa differenza. (In alternativa puoi usare `touch').
- qualcuno mi può spiegare un po meglio come funziona l'operatore - inteso come redirezione allo/dallo stdin stdout
In genere `-' si usa più come opzione di un programma (penso a tar o wget) che come operatore vero e proprio. In pratica si usa per dire ad un programma di spedire determinate informazioni sullo stdout (per poi magari essere manipolate da awk o sed).
Per ora credo che sia sufficiente.
thanks

Spero di essere stato chiaro e (possibilmente) utile.
Se vuoi approfondire ti consiglio ABS di Mendel Cooper, un'ottima guida allo scripting di Bash.