Como nadie ha respondido a la pregunta ("¿Qué está pasando en esta línea de código?" – “Estoy luchando por averiguar qué significa esta línea”):
El script está probando el programa C. Lo que está haciendo es básicamente equivalente a
# Run the program with input “1 2 5” and write its output to a file. Since the program
# is supposed to check the input for the minimum number, we expect it to output “1”.
echo "1 2 5" | $PROGRAM > file1
# Create a second file that contains the known correct output (minimum)
# for this input (i.e., “1”).
echo 1 > file2
# Compare the files. diff’s standard output and standard error will go to the stdout
# and stderr of the script, which is the terminal unless the user does I/O redirection.
# The `if` will test diff’s exit status.
if diff -u file1 file2
then
# Exit status 0 means the files are identical;
# i.e., the program’s output is correct; i.e., the test passes. Do nothing.
:
else
# Exit status non-zero (probably 1) means that the files are different;
# i.e., the program’s output is wrong; i.e., the test fails.
echo "test failed on 1 2 5"
((FAILURES++))
fi
rm file1 file2
Muy buena pregunta. Tal vez pueda preguntarle al autor del guión y transmitirnos su respuesta.
No hay necesidad de usar archivos. Y, está bien, no están usando archivos; son, como han explicado Andy Dalton y noelbk , usando sustitución de procesos — que son tuberías y que no cumplen con POSIX -. Y si,necesita usar un archivo o una tubería para capturar la salida del programa. Pero no necesita ni un archivo ni una canalización para mantener la salida correcta. El guión se puede reescribir
if [ "$(echo "1 2 5" | $PROGRAM)" != 1 ]
then
echo "test failed on 1 2 5"
((FAILURES++))
fi
que utiliza una sustitución de comando para capturar la salida del programa, y luego simplemente pone la salida correcta en la línea de comando if
.
-u
de diff
? diff -u
te mostrará las líneas 39 -45 (tres arriba y tres debajo del que es diferente ). Pero esto no tiene sentido cuando se sabe que una de las entradas tiene solo una línea de longitud, y se espera que el otro tenga solo una línea de largo. -u
de diff
es que muestra los tiempos de modificación de las entradas. Pero, en el script dado, las entradas a diff
son sustituciones de procesos, que son tuberías creadas dinámicamente. Entonces, los tiempos de modificación de cada uno son el tiempo actual: en otras palabras, en -desorden de pantalla. "$PROGRAM"
)a menos que tenga una buena razón para no hacerlo. Es imposible saberlo sin ver tu programa, o al menos su salida. ¿Es posible que su programa incluya un espacio en su salida, o un retorno de carro(\r
)en lugar de o además de una nueva línea? ¿O tal vez incluso una nueva línea adicional (, es decir, una línea en blanco )? haz esto
echo "1 2 5" | your_program | od -cab
(Si od
informa que no reconoce todas las opciones, omita el que se queja; por ejemplo, -cb
o -ab
. )La salida debe, por supuesto,sea un 1
y una nueva línea(\n
).