Innanzitutto, cat
scrive nell'output standard, che non è necessariamente un terminale, anche se è cat
stato digitato come parte di un comando in una shell interattiva. Se hai davvero bisogno di qualcosa da scrivere sul terminale anche quando viene reindirizzato l'output standard, non è così facile (devi specificare quale terminale, e potrebbe non essercene nemmeno uno se il comando viene eseguito da uno script), sebbene uno potrebbe (ab) utilizzare l'output di errore standard se il comando fa semplicemente parte di una pipeline. Ma dal momento che hai indicato che cat
effettivamente fa il lavoro, suppongo che non ti stia chiedendo una situazione del genere.
Se il tuo scopo fosse quello di inviare ciò che è scritto nell'output standard in una pipeline, l'utilizzo cat
sarebbe idoneo al Premio Inutile Uso del Gatto , poiché cat file | pipeline
(dove pipeline
sta per qualsiasi pipeline) può essere fatto in modo più efficiente <file pipeline
. Ma ancora una volta, dalle tue parole deduco che questa non era la tua intenzione.
Quindi non è così chiaro di cosa ti preoccupi. Se trovi cat
troppo tempo per scrivere, puoi definire un alias a uno o due caratteri (ci sono ancora alcuni di questi nomi che rimangono inutilizzati in Unix standard). Se comunque ti preoccupi che cat
passi cicli inutili, non dovresti.
Se esistesse un programma null
che non accetta argomenti e copia semplicemente l'input standard nell'output standard (l'oggetto neutro per le pipeline), è possibile fare ciò che si desidera <file null
. Non esiste un programma del genere, anche se sarebbe facile scrivere (un programma C con una sola riga main
può fare il lavoro), ma chiamare cat
senza argomenti (o cat -
se ti piace essere esplicito) fa proprio questo.
Se esistesse un nocat
programma che accetta esattamente un argomento per il nome del file, prova ad aprire il file, se non è in grado di lamentarsi, e in caso contrario procede alla copia dal file nell'output standard, sarebbe proprio quello che stai chiedendo. È solo leggermente più difficile da scrivere rispetto al fatto che null
il lavoro principale consiste nell'aprire il file, testare e possibilmente lamentarsi (se sei meticoloso, potresti anche voler includere un test che ci sia esattamente un argomento e lamentarti diversamente). Ma di nuovo cat
, ora fornito con un singolo argomento, fa proprio questo, quindi non c'è bisogno di alcun nocat
programma.
Una volta che sei riuscito a scrivere il nocat
programma, perché fermarsi a un singolo argomento? Avvolgere il codice in un ciclo non for(;*argp!=NULL;++argp)
è affatto uno sforzo, aggiunge al massimo un paio di istruzioni macchina al binario ed evita di dover lamentare un numero errato di argomenti (che risparmia molte più istruzioni). Voilà una versione primitiva di cat
, concatenare file. (Ad essere sincero devi modificarlo un po 'in modo che senza argomenti si comporti come null
.)
Naturalmente nel vero cat
programma hanno aggiunto alcune campane e fischietti, perché lo fanno sempre. Ma l'essenza è che l'aspetto di "concatenazione" dei cat
costi non comporta alcuno sforzo, né per il programmatore né per la macchina che lo esegue. Il fatto che cat
sussume null
e nocat
spiega la non esistenza di tali programmi. Evita di utilizzare cat
con un singolo argomento se il risultato entra in una pipeline, ma se viene utilizzato solo per visualizzare il contenuto del file sul terminale, anche la pagina a cui ho collegato ammette che questo è un uso utile di cat
, quindi non esitare.
Puoi verificare che cat
sia realmente implementato da un semplice ciclo attorno a una nocat
funzionalità ipotetica , chiamando cat
con diversi nomi di file tra cui un nome non valido, non in prima posizione: piuttosto che lamentarti subito che questo file non esiste, cat
prima scarica il precedente file validi, quindi si lamenta del file non valido (almeno così si comporta il mio gatto).