Fedora 20 застряла в аварийном режиме [дубликат]

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

¿Por qué se escribió el guión de esa manera?

Muy buena pregunta. Tal vez pueda preguntarle al autor del guión y transmitirnos su respuesta.

  1. 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.

  2. ¿Por qué usar la opción -ude diff?
    • Esta opción está documentada como "salida NUM (por defecto 3 )líneas de contexto unificado". Esto significa que, si tiene dos archivos de 100 líneas, y son idénticos excepto por la línea 42, entonces diff -ute 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.
    • Una característica no documentada de la opción -ude diffes que muestra los tiempos de modificación de las entradas. Pero, en el script dado, las entradas a diffson ​​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.
  3. Siempre debe citar variables de shell (por ejemplo,"$PROGRAM")a menos que tenga una buena razón para no hacerlo.

¿Por qué el script informa que su programa falló?

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 odinforma que no reconoce todas las opciones, omita el que se queja; por ejemplo, -cbo -ab. )La salida debe, por supuesto,sea ​​un 1y una nueva línea(\n).

41
07.04.2012, 09:01
0 ответов

Теги

Похожие вопросы