Prima che la shell esegua il cat
comando 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' cat
utilità in tutte queste istanze viene eseguita senza alcun argomento della riga di comando . I reindirizzamenti non sono operandi al cat
comando, 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 file
e cat <file
(o, se vuoi, <file cat
) è che nel primo caso, l' cat
utilità 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 cat
il flusso di input ad esso². Nel secondo caso, cat
noterà 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.
cat
leggerà anche dal suo input standard se viene dato l'operando -
. Ancora una volta, questo è speciale solo per cat
e per alcune altre utilità (cioè niente che la shell fa). Per utilizzare cat
su 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, file1
non verrà troncato se file2
inaccessibile (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 file
prima di eseguire sort file
e connettere sort
l'output standard al file. L' sort
utilità quindi aprirà file
e 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 sort
fa quando si utilizza il -o
file 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]