Saltar al contenido

¿Comando para enviar el contenido del archivo a stdout?

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 sistema
  • cat: 51 llamadas al sistema
  • grep: 1337 llamadas al sistema
  • head: 93 llamadas al sistema
  • tail: 130 llamadas al sistema
  • sed: 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.

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 . Pero de nuevo, de su redacción deduzco que esa no era su intención.

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 . No existe tal programa, aunque sería fácil de escribir (un programa en C con solo una línea 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología