Molte persone usano oneliner e script contenenti codice lungo le linee
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
Il primo cat
è spesso chiamato "uso inutile di gatto" perché tecnicamente richiede l'avvio di un nuovo processo (spesso /usr/bin/cat
) in cui ciò potrebbe essere evitato se il comando fosse stato
< "$MYFILE" command1 | command2 > "$OUTPUT"
perché allora la shell deve solo avviarsi command1
e puntare semplicemente stdin
al file dato.
Perché la shell non esegue automaticamente questa conversione? Sento che la sintassi dell '"uso inutile del gatto" è più facile da leggere e la shell dovrebbe avere abbastanza informazioni per sbarazzarsi automaticamente del gatto inutile. Il file cat
è definito nello standard POSIX, pertanto la shell dovrebbe essere autorizzata a implementarlo internamente anziché utilizzare un percorso binario. La shell potrebbe anche contenere l'implementazione solo per una versione dell'argomento e il fallback al percorso binario.
lseek
è un comportamento ancora definito e potrebbe causare un risultato diverso, il diverso comportamento di blocco può essere semanticamente significativo, ecc. Sarebbe possibile apportare la modifica se sapessi quali erano gli altri comandi e sapevi che non gli importava, o se non ti interessava la compatibilità a quel livello, ma il vantaggio è piuttosto piccolo. Immagino che la mancanza di benefici spinga la situazione più del costo di conformità.
cat
se stessa, o qualsiasi altra utility. È anche consentito sapere come funzionano le altre utility che appartengono al sistema (ad esempio, può sapere come si comporta l' grep
implementazione esterna fornita con il sistema ). Questo è completamente praticabile, quindi è del tutto giusto chiedersi perché non lo facciano.
grep
. E sed
. E awk
. E du
. E quante centinaia se non migliaia di altre utility?