Prima che la shell esegua il catcomando dalla riga di comando, cerca i reindirizzamenti.
Esistono due reindirizzamenti:
>file1 Questo farà andare l'output standard del comando file1.
<file2 Questo renderà l'input standard del comando da file2.
Il fatto che questi reindirizzamenti siano collocati in una posizione traballante sulla riga di comando non ha importanza.
$ cat <file2 >file1
equivale a
$ <file2 cat >file1
che è lo stesso di
$ <file2 >file1 cat
etc.¹
Si noti che l' catutilità in tutte queste istanze viene eseguita senza alcun argomento della riga di comando . I reindirizzamenti non sono operandi al catcomando, sono istruzioni alla shell per impostare i reindirizzamenti dentro e fuori il comando (collegando l'input e l'output standard ai file). La shell imposta i reindirizzamenti prima di invocare il comando.
La differenza tra cat filee cat <file(o, se vuoi, <file cat) è che nel primo caso, l' catutilità stessa sta aprendo il file, che viene dato come operando sulla riga di comando, per leggere, mentre nel secondo caso, la shell sarà apri il file e connetti catil flusso di input ad esso². Nel secondo caso, catnoterà che non è stato assegnato un operando di file e passerà automaticamente alla lettura dal suo input standard. Questa è una caratteristica di cat, e di alcune altre utility, non qualcosa che fanno tutte le utility.
catleggerà anche dal suo input standard se viene dato l'operando -. Ancora una volta, questo è speciale solo per cate per alcune altre utilità (cioè niente che la shell fa). Per utilizzare catsu un file nella directory corrente il cui nome è - , aggiungere un percorso al nome file, ad esempio ./-.
¹ L'ordine dei reindirizzamenti è ancora importante in alcune circostanze; Con cat <file2 >file1, ad esempio, file1non verrà troncato se file2inaccessibile (i reindirizzamenti vengono analizzati da sinistra a destra). Il posizionamento relativo della parola catè comunque ancora arbitrario e non influenzerà questo.
² Vedi anche la domanda " cat dà un errore diverso quando si apre un file inesistente ".
Il fatto che la shell imposti i reindirizzamenti prima ancora di eseguire il comando sulla riga di comando è il motivo per cui cose come queste falliscono e si finisce con un file di output vuoto:
$ sort file >file
Qui, la shell tronca (svuota) il file fileprima di eseguire sort filee connettere sortl'output standard al file. L' sortutilità quindi aprirà filee ordinerà il suo contenuto (che è nulla). Il risultato (nulla) viene passato attraverso il flusso di output standard a file.
Il rimedio in questo caso particolare (per ordinare un file "sul posto") è
$ sort -o file file
o
$ sort file >file.sorted && mv file.sorted file
che è più o meno ciò che sortfa quando si utilizza il -ofile per specificare il nome del file di output.
Solo per eseguire il backup dell'affermazione che i reindirizzamenti possono precedere il nome effettivo dell'utilità sulla riga di comando:
Un "comando semplice" è una sequenza di assegnazioni e reindirizzamenti variabili facoltativi, in qualsiasi sequenza, facoltativamente seguiti da parole e reindirizzamenti, terminati da un operatore di controllo. [ref: POSIX Shell Command Language 2.9.1 Comandi semplici]
E anche sul reindirizzamento che non fa parte degli operandi dell'utilità:
Il numero facoltativo, l'operatore di reindirizzamento e la parola non devono apparire negli argomenti forniti al comando da eseguire (se presenti). [ref: POSIX Shell Command Language 2.7 Reindirizzamento]