%20em%20uma%20vari%C3%A1vel.png)
Quero testar se há alguma saída de diff
(testar se os arquivos são iguais), se nenhum echo "Passed $x" else echo "Failed $x"
. Eu criei uma etapa intermediária (salvar a saída do diff em um arquivo e depois ler do arquivo)
diff "./helloworld$x.out" "./output/helloworld$x.out" > tmp.txt;
output="`cat tmp.txt`";
if [ "$output" = "" ];
then
echo "Passed $x";
else
echo "Failed $x";
fi;
Tenho certeza de que o código pode ser melhorado? A questão principal é: é possível salvar a saída diff
diretamente em uma variável?
Responder1
Isso funciona:
if diff "./helloworld$x.out" "./output/helloworld$x.out" >/dev/null; então echo "$x passado"; outro echo "Falha $x"; fi
Se você usar uma variável em vez de echo
você pode descartar a else
ramificação: defina a variável como falsa antes de if
e salve 2 linhas de código.
Se você quiser realmente colocar o resultado em uma variável, use:
some_var="$(diff "./helloworld$x.out" "./output/helloworld$x.out")"
Incluindo meu teste para ver se realmente funciona:
rinzwind@discworld:~$ toque 1 rinzwind@discworld:~$ toque 2 rinzwind@discworld:~$ mais testes se diferença 1 2 >/dev/null; então echo "$x passado"; outro echo "Falha $x"; fi rinzwind@discworld:~$ ./test Passado rinzwind@discworld:~$ vi 2 rinzwind@discworld:~$ mais 2 2 rinzwind@discworld:~$ ./test Fracassado
Por outro >/dev/null
lado: >/dev/null 2>&1
enviará a saída >/dev/null
e 2>&1
enviará erros padrão para o mesmo arquivo ( &1
significa 'usar o primeiro parâmetro') na frente deste comando (portanto, também usa /dev/null
).
sidenote: sdiff
mostrará listagens lado a lado diff
:
diferença 1 2 1 1 2 2 3 3 4 4 5 5 7 7 > 8 9 9 10 10
Responder2
diff
pode até suprimir completamente a saída, exceto a mensagem "Arquivos /bin/bash e /bin/sh diferentes" usando o código abaixo.
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
if diff -q "$file1" "$file2"; then
echo "Passed $x"
else
echo "Failed $x"
fi
Se você quiser ocultar essa mensagem, deverá anexar > /dev/null
após o comando diff para ocultar a saída de diff
:
if diff -q "$file1" "$file2" >/dev/null; then
/dev/null
é um arquivo especial que funciona como um buraco negro; se você escrever nele, ele desaparecerá; se você estiver lendo, não receberá nada em troca.
Observe que o bash não precisa ;
encerrar as linhas.
Quanto à pergunta original, para salvar a saída de um programa em uma variável:
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
output="$(diff -q "$file1" "$file2")"
# the quotes are mandatory, this checks whether $output is empty or not
if [ -n "$output" ]; then
echo "Passed $x"
else
echo "Failed $x"
fi
Maneiras alternativas de verificar se uma variável está vazia:
[ "$output" = "" ]
[ "$output" == "" ]
[[ "$output" == "" ]]
[[ $output == "" ]]
Se você estiver usando Bash, os dois últimos comandos são recomendados para comparação de strings. Caso contrário, o primeiro [ -n "$output" ]
é recomendado.
Responder3
a) A saída do comando1 pode ser capturada com
output=$(diff "helloworld$x.out" "output/helloworld$x.out")
ou com crases, mas eles são desencorajados, porque você não pode aninhá-los e pode ser difícil distingui-los dos apóstrofos, dependendo da fonte:
output=`cmd1`
b) Em vez de gravar em um arquivo e depois ler esse arquivo (ou capturar a saída e ecoá-la), você usaria um canal diretamente:
cmd1 > file
cat file | cmd2
output=$(cmd1)
echo "${output}" | cmd2
=>
cmd1 | cmd2
mas no seu exemplo, você não está interessado na saída, mas no resultado do programa - funcionou?
diff "helloworld$x.out" "output/helloworld$x.out" && echo "success" || echo "failure"
Para ler sobre o uso de && e || procure por "atalho E e atalho OU".
Para manter a saída limpa, você pode redirecionar a saída de 'diff' para lugar nenhum:
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null && echo "success" || echo "failure"
Para obter sucesso e avaliá-lo mais tarde, você armazena o resultado do último comando em uma variável com $?:
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null
result=$?
# do something else
case $result in
0) echo success ;;
*) echo failure ;;
esac
Responder4
Se você quiser saber se dois arquivos são iguais ou diferentes (mas não se importa qual é realmente a diferença), cmp
é mais adequado.
if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi