Posterior a consultar especialistas en este tema, programadores de varias áreas y maestros hemos dado con la solución al dilema y la compartimos en esta publicación.
Solución:
El más obvio es cat
. Pero, también eche un vistazo a head
y tail
. También hay otras utilidades de shell para imprimir un archivo línea por línea: sed
, awk
, grep
. Pero esos son para alternar el contenido del archivo o para buscar dentro del archivo.
Hice algunas pruebas para estimar cuál es la más efectiva. Corro todo a través strace
para ver cuál hizo la menor cantidad de llamadas al sistema. Mi archivo tiene 1275 líneas.
awk
: 1355 llamadas al sistemacat
: 51 llamadas al sistemagrep
: 1337 llamadas al sistemahead
: 93 llamadas al sistematail
: 130 llamadas al sistemased
: 1378 llamadas al sistema
Como puede ver, incluso si cat
fue diseñado para concatenar archivos, es el más rápido y efectivo. sed
, awk
y grep
imprimió el archivo línea por línea, por eso tienen más de 1275 llamadas al sistema.
sé
cat
puede hacer esto, pero su propósito principal es concatenar en lugar de simplemente mostrar el contenido.
El propósito de cat
es exactamente eso, leer un archivo y enviarlo a stdout.
Primero, cat
escribe en la salida estándar, que no es necesariamente una terminal, incluso si cat
se escribió como parte de un comando en un shell interactivo. Si realmente necesita algo para escribir en el terminal incluso cuando se redirige la salida estándar, no es tan fácil (debe especificar qué terminal, y puede que ni siquiera haya uno si el comando se ejecuta desde un script), aunque uno podría (ab) usar la salida de error estándar si el comando es simplemente una parte de una canalización. Pero ya que indicaste que cat
realmente hace el trabajo, supongo que no estabas preguntando sobre tal situación.
Si su propósito fuera enviar lo que está escrito en la salida estándar en una tubería, entonces use cat
sería elegible para el premio Uso inútil de gato, ya que cat file | pipeline
(donde pipeline
significa cualquier tubería) se puede hacer de manera más eficiente ya que
Por lo tanto, no está tan claro qué es lo que le preocupa. Si tu encuentras cat
demasiado largo para escribir, puede definir un alias de uno o dos caracteres (todavía hay algunos nombres de este tipo que no se utilizan en Unix estándar). Sin embargo, si te preocupa eso cat
está gastando ciclos inútiles, no debería.
Si hubiera un programa null
que no toma argumentos y solo copia la entrada estándar a la salida estándar (el objeto neutral para las tuberías), podría hacer lo que quiera con main
función puede hacer el trabajo), pero llamando cat
sin argumentos (o cat -
si quieres ser explícito) hace precisamente eso.
Si hubiera un nocat
programa que toma exactamente un argumento de nombre de archivo, intenta abrir el archivo, se queja si no puede y, de lo contrario, procede a copiar desde el archivo a la salida estándar, entonces eso sería justo lo que está pidiendo. Es solo un poco más difícil de escribir que null
, el trabajo principal es abrir el archivo, probar y posiblemente quejarse (si es meticuloso, es posible que también desee incluir una prueba de que hay exactamente un argumento y quejarse de lo contrario). Pero otra vez cat
, ahora provisto con un solo argumento, hace precisamente eso, por lo que no hay necesidad de ningún nocat
programa.
Una vez que haya logrado escribir el nocat
programa, ¿por qué detenerse en un solo argumento? Envolviendo el código en un bucle for(;*argp!=NULL;++argp)
Realmente no supone ningún esfuerzo, añade como máximo un par de instrucciones de máquina al binario y evita tener que quejarse de un número incorrecto de argumentos (lo que ahorra muchas más instrucciones). Voilà una versión primitiva de cat
, concatenando archivos. (Para ser honesto, debe modificarlo un poco para que, sin argumentos, se comporte como null
.)
Por supuesto en lo real cat
programa, agregaron algunas campanas y silbidos, porque siempre lo hacen. Pero la esencia es que el aspecto de "concatenación" de cat
Realmente no cuesta ningún esfuerzo, ni para el programador ni para la máquina que lo ejecuta. El hecho de que cat
subsume null
y nocat
explica la inexistencia de tales programas. Evitar el uso de cat
con un solo argumento si el resultado entra en una tubería, pero si se usa solo para mostrar el contenido del archivo en la terminal, incluso la página a la que me vinculé admite que este es un uso útil de cat
, así que no lo dudes.
Puedes probar eso cat
Realmente se implementa mediante un simple bucle alrededor de un hipético nocat
funcionalidad, llamando cat
con varios nombres de archivo entre los cuales un nombre inválido, no en la primera posición: en lugar de quejarse de inmediato de que este archivo no existe, cat
primero vuelca los archivos válidos anteriores y luego se queja del archivo no válido (al menos así es como se comporta mi gato).
Más adelante puedes encontrar las notas de otros administradores, tú también tienes el poder mostrar el tuyo si te apetece.