/ / No se puede redirigir el mensaje de error en mi comando - linux, bash, shell

Error al redirigir el mensaje de error en mi comando: linux, bash, shell

Soy un novato en el script de bash, y aquí está básicamente mi script de bash:

Z=`diff -Z $ref_out $exec_out | grep "[<>]" | wc -l` 2>/dev/null
if [ $Z -gt 0 ]; then
echo "*** testcase: [ stdout - FAILED ]"
else
echo "*** testcase: [ stdout - PASSED ]"
fi

Me gustaría suprimir el mensaje de error de diff como:

diff: No such file or directory

Esto podría ser resultado de ningún archivo $ ref_out o $ exec_out, aunque estoy redirigiendo a / dev / null, este mensaje de error aún aparece. ¿Alguna ayuda?

Respuestas

3 para la respuesta № 1

Necesitas diff"s stderr para ir a / dev / null, por lo que debería ser:

Z=`diff -Z $ref_out $exec_out 2> /dev/null | grep "[<>]" | wc -l`

0 para la respuesta № 2

Su redirección no funciona porque se está aplicando al shell principal, no al subshell que ejecuta la canalización.

Si desea enviar el stderr de un grupo de comandos a / dev / null, puede hacerlo de esta manera: estoy usando $() en lugar de comillas traseras:

Z=$( { diff -Z $ref_out $exec_out | grep "[<>]" | wc -l; } 2>/dev/null )

Aquí, 2>/dev/null se aplica a todos los comandos dentro { }.


Hay muchos problemas en su código. Podrías reescribirlo de una mejor manera:

if diff -Z "$ref_out" "$exec_out" 2>/dev/null | grep -q "[<>]"; then
echo "*** testcase: [ stdout - FAILED ]"
else
echo "*** testcase: [ stdout - PASSED ]"
fi
  • grep -q es una mejor manera de hacer esta verificación y no necesitará un wc -l a menos que quieras saber el número exacto de coincidencias
  • necesitas citar tus variables
  • if la declaración puede incluir comandos; no necesita capturar el resultado para usarlo en la instrucción if

Puedes usar chequeo para validar su script de shell y ver si está cometiendo los errores habituales que pueden romper su código.