Chcę przekierować wyjście programu do pliku o nazwie zmiennej i jednocześnie przekierować możliwy błąd. To jest dotychczasowy skrypt:
#!/bin/bash echo "Se ejecutará el PET-linux.x con PET.inp como input, debe indicarse el nombre del archivo output." echo "Nombre del archivo .out: " read outfile ./PET-linux.x < PET.inp > ${outfile}.out 2> /dev/null echo $?
Jeśli uruchomię program ze świadomością, że spowoduje błąd, w terminalu pojawi się następujący komunikat:
samuel@samuel-P5Wx6:~/Documents/Fisica/19-20/Radiactividad/Prácticas/Practicas-MontCarlo/PET/pruebas$ ./ejecutarPET.sh Se ejecutará el PET-linux.x con PET.inp como input, debe indicarse el nombre del archivo output. Nombre del archivo .out: test ./ejecutarPET.sh: line 7: 25715 Floating point exception(core dumped) ./PET-linux.x < PET.inp > ${outfile}.out 2> /dev/null 136
Wiem, dlaczego występuje ten błąd, ale chcę, aby nie pojawiał się na terminalu w ten sposób. Czy „t mogę używać 2>
w tym samym czasie co >
?
Dziękuję.
Komentarze
- Powłoka uruchamiająca skrypt zgłasza błąd, a nie sam program PET-linux.x. Przekierowanie dotyczy tylko programu PET-linux.x .
Odpowiedź
Jak wskazano w komentarze , to twój skrypt powłoki zgłasza wyjątek zmiennoprzecinkowy z Twojej aplikacji.
Zmodyfikuj wiersz PET-linux.x
w następujący sposób, aby wychwycić wyjątek i po cichu wyjdź. Możesz przetestować wyjątek, sprawdzając stan powrotu dla 136 i logując go w razie potrzeby. (Jeśli nie chcesz raportowania, po prostu pomiń tę drugą linię. Dołączam ją, aby zobaczyć, jak w razie potrzeby zidentyfikowałbyś wyjątek zmiennoprzecinkowy programowo.)
( trap "exit" SIGFPE; ./PET-linux.x < PET.inp > "$outfile.out" ) 2>/dev/null [[ $? -eq 136 ]] && echo "Uh oh we caught a floating point exception" >&2
Komentarze
- Udało się! Wielkie dzięki!