Script BASH: límites seguros para la cadena de salida del comando
Frecuentes
Visto 3,865 veces
1
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.
2 Respuestas
5
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
1
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 bash svn xargs or haz tu propia pregunta.
posible duplicado de ¿Cuál es el tamaño máximo de un valor de variable de entorno? - dogbane
¿Por qué no usas
wc -l
en lugar degrep -c '.*'
? Además, debe citar sus variables:echo "$TEST_TEXT"
en ambos lugares. - Dennis Williamsonfind -iname *.cpp | rm
no funcionará porquerm
no toma archivos de stdin, pero ¿por qué cree que "podría fallar si tenemos MUCHOS resultados"? - Kevin