Innanzitutto, catscrive nell'output standard, che non è necessariamente un terminale, anche se è catstato 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 cateffettivamente 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 catsarebbe idoneo al Premio Inutile Uso del Gatto , poiché cat file | pipeline(dove pipelinesta 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 cattroppo 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 catpassi cicli inutili, non dovresti.
Se esistesse un programma nullche 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 mainpuò fare il lavoro), ma chiamare catsenza argomenti (o cat -se ti piace essere esplicito) fa proprio questo.
Se esistesse un nocatprogramma 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 nullil 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 nocatprogramma.
Una volta che sei riuscito a scrivere il nocatprogramma, 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 catprogramma hanno aggiunto alcune campane e fischietti, perché lo fanno sempre. Ma l'essenza è che l'aspetto di "concatenazione" dei catcosti non comporta alcuno sforzo, né per il programmatore né per la macchina che lo esegue. Il fatto che catsussume nulle nocatspiega la non esistenza di tali programmi. Evita di utilizzare catcon 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 catsia realmente implementato da un semplice ciclo attorno a una nocatfunzionalità ipotetica , chiamando catcon diversi nomi di file tra cui un nome non valido, non in prima posizione: piuttosto che lamentarti subito che questo file non esiste, catprima scarica il precedente file validi, quindi si lamenta del file non valido (almeno così si comporta il mio gatto).