Script BASH: límites seguros para la cadena de salida del comando

Buenos días,

Estoy escribiendo un script BASH relativamente simple que ejecuta un comando SVN UP, captura la salida de la consola y luego realiza un procesamiento posterior en el texto.

Por ejemplo:

#!/bin/bash
# A script to alter SVN logs a bit

# Update and get output
echo "Waiting for update command to complete..."
TEST_TEXT=$(svn up --set-depth infinity)
echo "Done"

# Count number of lines in output and report it
NUM_LINES=$(echo $TEST_TEXT | grep -c '.*')
echo "Number of lines in output log: $NUM_LINES"

# Print out only lines containing Makefile
echo $TEST_TEXT | grep Makefile

Esto funciona como se esperaba (es decir, como se comentó en el código anterior), pero me preocupa lo que sucedería si ejecutara esto en un repositorio muy grande. ¿Existe un límite en el tamaño máximo de búfer que BASH puede usar para contener la salida de un comando de consola?

He buscado preguntas similares, pero nada como lo que estoy buscando. He leído sobre cómo ciertos scripts necesitan usar el xargs en casos de grandes búferes intermedios, y me pregunto si algo similar se aplica aquí con respecto a la captura de la salida de la consola.

p.ej:

# Might fail if we have a LOT of results
find -iname *.cpp | rm

# Shouldn't fail, regardless of number of results
find -iname *.cpp | xargs rm

Gracias por su atención.

preguntado el 22 de mayo de 12 a las 17:05

¿Por qué no usas wc -l en lugar de grep -c '.*'? Además, debe citar sus variables: echo "$TEST_TEXT" en ambos lugares. -

find -iname *.cpp | rm no funcionará porque rm no toma archivos de stdin, pero ¿por qué cree que "podría fallar si tenemos MUCHOS resultados"? -

2 Respuestas

Usar

var=$(hexdump /dev/urandom | tee out)

bash no se quejó; Lo maté un poco más de 1G y 23.5 millones de líneas. No necesita preocuparse mientras su salida quepa en la memoria de su sistema.

contestado el 22 de mayo de 12 a las 18:05

No veo ninguna razón para no usar un archivo temporal aquí.

tmp_file=$(mktemp XXXXX)

svn up --set-depth=infinity > $tmp_file
echo "Done"

# Count number of lines in output and report it
NUM_LINES=$(wc -l $tmp_file)
echo "Number of lines in output log: $NUM_LINES"

# Print out only lines containing Makefile
grep Makefile $tmp_file

rm $tmp_file

contestado el 22 de mayo de 12 a las 19:05

Lo suficientemente justo. +1 No puedo escribir en el sistema de archivos (ro), lo que me impide hacerlo. Sin embargo, no especifiqué esto en TFQ, y es válido dados los detalles que proporcioné. ¡Gracias! - Cloud

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.