Muchas personas usan líneas y scripts que contienen código a lo largo de las líneas.
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
El primero a cat
menudo se llama "uso inútil del gato" porque técnicamente requiere comenzar un nuevo proceso (a menudo /usr/bin/cat
) en el que esto podría evitarse si el comando hubiera sido
< "$MYFILE" command1 | command2 > "$OUTPUT"
porque entonces shell solo necesita comenzar command1
y simplemente apuntarlo stdin
al archivo dado.
¿Por qué el shell no realiza esta conversión automáticamente? Creo que la sintaxis de "uso inútil del gato" es más fácil de leer y Shell debería tener suficiente información para deshacerse del gato inútil automáticamente. El cat
está definido en el estándar POSIX, por lo que se debe permitir que Shell lo implemente internamente en lugar de usar un binario en la ruta. El shell incluso podría contener la implementación solo para una versión de argumento exactamente y recurrir a la ruta binaria.
lseek
todavía es un comportamiento definido y podría causar un resultado diferente, el diferente comportamiento de bloqueo puede ser semánticamente significativo, etc. Sería posible realizar el cambio si supiera cuáles eran los otros comandos y supiera que no les importaba, o si simplemente no le importaba la compatibilidad a ese nivel, pero el beneficio es bastante pequeño. Me imagino que la falta de beneficios impulsa la situación más que el costo de conformidad.
cat
embargo, el shell está absolutamente autorizado a implementarse , o cualquier otra utilidad. También se permite saber cómo funcionan las otras utilidades que pertenecen al sistema (por ejemplo, puede saber cómo se comporta la grep
implementación externa que vino con el sistema ). Esto es completamente viable, por lo que es completamente justo preguntarse por qué no lo hacen.
grep
. Y sed
. Y awk
. Y du
. ¿Y cuántos cientos, si no miles, de otras utilidades?