/ / Nie można przekierować komunikatu o błędzie w moim poleceniu - linux, bash, shell

Brak przekierowania komunikatu o błędzie w moim poleceniu - linux, bash, shell

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

Potrzebujesz 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 potrzebujesz wc -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.