Una delle differenze fondamentali tra UNIX e Windows è che Windows tende ad avere complesse applicazioni monolitiche, mentre UNIX raggiunge complessità combinando piccole applicazioni autonome ciascuna delle quali è utile per eseguire un'attività specifica. In Windows, una particolare applicazione, non importa quanto possa essere ricca e complessa, è tutto ciò che hai . In UNIX puoi combinare le applicazioni in molti modi diversi per soddisfare le tue esigenze. È un mondo completamente diverso, un modo diverso di pensare e lavorare.
Se vuoi sperimentare tutto questo devi solo lavorare con UNIX per un po 'su compiti specifici, è difficile apprezzarlo in astratto. Ma ecco un piccolo esempio. Supponiamo di voler cercare tutti i file sorgente C ++ contenenti la macro USE64BIT. Ecco un modo (il mio modo) per risolvere questo problema su un sistema UNIX (in particolare, su Ubuntu GNU / Linux 10.04).
Per verificare se un file contiene una stringa, io uso grep. Quindi scriverei:
$ grep USE64BIT mysource.cpp
o
$ grep -H USE64BIT mysource.cpp
se voglio stampare il nome del file corrispondente prima di ogni riga corrispondente.
Ora, voglio trovare tutti i file C ++, quindi ho bisogno di uno strumento per cercare i file. Io uso find:
$ find . -name "*.cpp" -print
Questo troverà tutti i file con nomi corrispondenti al modello * .cpp che inizia nella directory corrente (il primo parametro '.') e stampa ciascun percorso file (relativo a.) su una riga di output separata.
Bene, ora voglio inserire l'output di find in grep per ottenere tutti i file contenenti la mia stringa. Ho un altro strumento: xargs. xargs può chiamare ripetutamente un altro strumento, passandolo come parametro ciò che ottiene dallo standard input. Quindi abbiamo bisogno di qualcosa del tipo:
$ find ... -> xargs ... grep <input to xargs>
Quanto sopra non è un comando valido, ma l'idea è di reindirizzare il risultato di find in xargs e lasciare che xargs chiami grep su ogni riga di input. Ecco una prima soluzione:
$ find . -name "*.cpp" -print | xargs -iFILE grep -H USE64BIT FILE
Qui, l'output di find contiene tutti i file trovati, uno per riga. xargs prende ogni riga di input, imposta la variabile FILE su di essa e chiama ripetutamente grep, ogni volta passandogli il valore corrente di FILE come parametro. Il risultato di tutte queste chiamate a grep è concatenato insieme al flusso di output finale.
Questa soluzione può ancora essere migliorata: si dovrebbe usare -print0 in find e -0 in xargs in modo che l'output di find usi un carattere 0 invece di newline come separatore (i nomi dei file non conterranno mai un carattere 0, quindi 0 è un separatore più sicuro). Quindi, la soluzione finale è
$ find . -name "*.cpp" -print0 | xargs -0 -iFILE grep -H USE64BIT FILE
Questo è quello che stavamo cercando: tutte le linee in tutti i file C ++ contenenti la macro fornita.
Se non ti interessa vedere le linee corrispondenti, ma solo i file corrispondenti, puoi cambiare l'opzione nel comando grep. Su GNU / Linux puoi usare -l per stampare solo il nome del file corrispondente:
$ find . -name "*.cpp" -print0 | xargs -0 -iFILE grep -l USE64BIT FILE
Oh, ma ora vuoi ordinare l'elenco dei file corrispondenti in ordine alfabetico. Fine:
$ find . -name "*.cpp" -print0 | xargs -0 -iFILE grep -l USE64BIT FILE | sort
E, naturalmente, potresti continuare e inventare sempre più esempi.
Come puoi vedere, ogni comando è relativamente semplice e molto specializzato, ma puoi eseguire compiti molto complessi combinando diversi comandi. Puoi guidare il sistema operativo per ottenere esattamente ciò che desideri. Questo è per me uno dei motivi per cui apprezzo così tanto i sistemi UNIX perché non ho trovato questa flessibilità, ad es. Su Windows. La prima cosa che faccio quando ho di lavorare su un sistema Windows è installare cygwin (un ambiente simile a UNIX per Windows).