Як переадресувати лише stderr?


13

У мене виникають проблеми з цим. Мені потрібно запустити компільований .java файл і перенаправити лише stderr на файл, який називається помилка. Отже файл .java називається javaProgram.java.

Це те, що я спробував:

java javaProgram 2> error

Однак коли я

cat error

виявляється, що там є речі, навіть коли я знаю, що конкретний файл .java не має помилок. Я щось роблю не так? Я хочу, щоб цей файл помилок відображався - це помилки, не більше нічого.

Відповіді:


16

Ваша перша спроба була правильною; 2>filenameце те, як ви переспрямовуєте stderr. Можливо, ваша програма записує деякі непомилки в stderr, або програма java запускає інші програми, які виводять на stderr.


1

Проста відповідь - це неможливо. Стандартна помилка використовується для написання діагностичного виводу, і саме програми повинні визначати, що таке діагностичний / помилковий вихід. Це відповідно до стандарту POSIX .


2
Якщо ви збираєтесь цитувати специфікацію POSIX, будь ласка, цитуйте конкретний розділ, а не весь документ. Це величезне.
jordanm

З тих пір, коли неможливо перенаправити stderr на файл у POSIX? Для цього вам доведеться надати фактичну пропозицію.
l0b0

1
@ l0b0 це не те, що говорить Джейт. Додатки вирішують, що переходить на STDOUT і що на STDERR; наприклад, цілком можна запхнути все в STDOUT, і тоді перенаправлення STDERR не матиме ефекту. Або, як і в цьому випадку, можливо (і стандартна практика) помістити в STDERR деякі речі, які не є строгими помилками. Єдиний спосіб, коли можна було б розібрати помилки, отримані в інших діагностиках, полягав би в тому, якщо помилки позначені символом "ПОМИЛКА:" або щось подібне. Можливо, є перемикач багатослівностей, який може допомогти, але це специфічно для програми.
зол

ОП поставило дві семантично різні проблеми: "перенаправити лише stderr на файл, який називається помилка" та "Я хочу, щоб цей файл помилок відображав - це помилки, не більше нічого". Перша частина цього, безумовно, не неможлива.
l0b0

@ l0b0 Ви отримали це назад. ОП однозначно може перенаправити stderr у файл, який називається помилка. Він не може вибрати, який Java видає як stderr, оскільки вміст stderr контролюється додатком, а не користувачем. Що він може зробити, - це вилучити файл, в який передано stderr для фактичних повідомлень про помилки.
Jeight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.