Jestem debiutantem w skryptach bashowych i tutaj jest w zasadzie mój skrypt bashowy:
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
Chciałbym wyłączyć komunikat o błędzie od diff, taki jak:
diff: No such file or directory
Może to wynikać z braku pliku $ ref_out lub $ exec_out, chociaż przekierowuję do / dev / null, ten komunikat o błędzie wciąż się pojawia. Jakaś pomoc?
Odpowiedzi:
3 dla odpowiedzi № 1Potrzebujesz diff
„s stderr, aby przejść do / dev / null, więc powinno to być:
Z=`diff -Z $ref_out $exec_out 2> /dev/null | grep "[<>]" | wc -l`
0 dla odpowiedzi nr 2
Przekierowanie nie działa, ponieważ jest stosowane do powłoki macierzystej, a nie do podpowłoki, która uruchamia potok.
Jeśli chcesz wysłać stderr z kilku poleceń do / dev / null, możesz to zrobić w ten sposób - używam $()
zamiast backticks:
Z=$( { diff -Z $ref_out $exec_out | grep "[<>]" | wc -l; } 2>/dev/null )
Tutaj, 2>/dev/null
dotyczy wszystkich poleceń wewnątrz { }
.
Twój kod zawiera wiele problemów. Możesz go przepisać w lepszy sposób:
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
to lepszy sposób na sprawdzenie tego i nie potrzebujeszwc -l
chyba że chcesz znać dokładną liczbę meczów- musisz podać swoje zmienne
if
instrukcja może zawierać polecenia; nie musisz przechwytywać wyjścia, aby użyć go w instrukcji if
Możesz użyć kontrola muszli sprawdzić poprawność skryptu powłoki i sprawdzić, czy robisz zwykłe błędy, które mogą złamać Twój kod.