Jak przekierować tylko stderr?

13

Mam trochę problemów z tym. Muszę uruchomić skompilowany plik .java i przekierować tylko stderr do pliku o nazwie błąd. Tak więc plik .java nosi nazwę javaProgram.java.

Oto, co próbowałem:

java javaProgram 2> error

Jednak kiedy ja

cat error

wygląda na to, że jest tam coś, nawet jeśli wiem na pewno, że konkretny plik .java nie zawiera błędów. czy robię coś źle? Chcę tylko, aby ten plik błędów wyświetlał błędy, a nie cokolwiek innego.

Jan
źródło

Odpowiedzi:

16

Twoja pierwsza próba była poprawna; 2>filenameto sposób przekierowania stderr. Może się zdarzyć, że twój program pisze pewne błędy do stderr lub program java uruchamia inne programy, które wypisują do stderr.

Mark Plotnick
źródło
1

Prosta odpowiedź brzmi: nie jest to możliwe. Standardowy błąd służy do zapisywania danych wyjściowych diagnostycznych i do aplikacji należy określenie, co jest danymi wyjściowymi diagnostycznymi / błędnymi. Jest to zgodne ze standardem POSIX .

Jeight
źródło
2
Jeśli chcesz zacytować specyfikację POSIX, proszę zacytować konkretną sekcję, a nie cały dokument. To jest ogromne.
Jordan
Od kiedy nie jest możliwe przekierowanie stderr do pliku w POSIX? Musisz podać faktyczną wycenę.
l0b0,
1
@ l0b0 to nie to, co mówi Jeight. Od aplikacji zależy decyzja, co będzie STDOUT, a co STDERR; na przykład można całkowicie włożyć wszystko do STDOUT, a przekierowanie STDERR nie przyniosłoby żadnego efektu. Lub, jak w tym przypadku, możliwe jest (i standardowa praktyka) umieszczenie w STDERR niektórych rzeczy, które nie są ściśle błędami. Jedynym sposobem, w jaki można by przeanalizować błędy z innych metod diagnostycznych, byłoby oznaczenie błędów jako „ERROR:” lub coś w tym rodzaju. Może istnieć przełącznik gadatliwości, który może pomóc, ale jest to specyficzne dla programu.
evilsoup
OP stwarza dwa semantycznie różne problemy: „przekierowuje tylko stderr do pliku o nazwie błąd” i „Chcę, aby ten plik błędów wyświetlał błędy, a nie cokolwiek innego”. Chodzi mi o to, że pierwsza część tego z pewnością nie jest niemożliwa.
l0b0
@ l0b0 Masz to wstecz. OP zdecydowanie może przekierować stderr do pliku o nazwie błąd. Nie może wybrać, jakie dane wyjściowe Java mają jako stderr, ponieważ zawartość stderr jest kontrolowana przez aplikację, a nie przez użytkownika. To, co może zrobić, to grep plik, do którego przekazano stderr dla rzeczywistych komunikatów o błędach.
Jeight