Linux менше поведінки та жорсткіший


11

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

Я розумію , що не може бути ніякого рішення цього, я прочитав про teeта , multiteeале не щастило до сих пір.


2
Ви говорите мені, як перенаправити stderr на stdout, але це не те, що я хотів. Я не хочу, щоб stderr менше змішувався зі stdout всередині. Мені б хотілося, щоб stderr знаходився в терміналі, коли я виїжджаю менше.

Якщо stderrпереспрямовано на stdout, весь вихідний сигнал stderr буде змішаний з нормальним вихідним сигналом stdout. Підключення до цього виводу lessпокаже і те й інше.
Якийсь програміст чувак

Якщо я ігнорую "stderr бути в терміналі, коли виходжу менше", пропоную натиснути Ctrl-L, lessщоб перефарбувати екран.
kamae

Відповіді:


10

Можливо

command 2> command.err | less; cat command.err; rm command.err

Додаток

Тут випливає роз'яснення для людей, які нехтують уважно прочитати питання та не прочитали пояснювальний коментар ОП вище.

Гелікс вказав:

Лінії stderr зазвичай перераховуються між рядками stdout всередині менше

і в коментарі для ранніх відповідей написав:

Ви говорите мені, як перенаправити stderr на stdout, але це не те, що я хотів. Я не хочу, щоб stderr менше змішувався зі stdout всередині. Мені б хотілося, щоб stderr знаходився в терміналі, коли я виїжджаю менше

Проблема, ймовірно, залежить від платформи, це, безумовно, те, що я відчував на старих платформах Unix SVR4.

Якщо на таких платформах ви робите щось подібне

 find / ... | less

будь-які повідомлення про помилки (наприклад, дозволи довідників) виглядають таким чином менше

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

так що вихідні рядки затемнюються повідомленнями про помилки.

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

Якщо ти робиш щось подібне

  find / ... 2>&1 | less

Повідомлення про помилки переплутані зі стандартним висновком. Знову, коли ви виходите менше, екран порожній.

Якщо ви хочете спочатку вивчити лише стандартний висновок менше, а потім побачити повідомлення про помилки після виходу менше, вам потрібно інше рішення.

Саме це я орієнтовно пропонував у своїй оригінальній, дворядковій відповіді.


Це сміття. Відповідь Йоахіма повинна бути такою, яку прийняли.
Ванільне обличчя

2
@VanillaFace: Я додав кілька уточнюючих матеріалів у свою відповідь.
RedGrittyBrick

16

Ви повинні переспрямувати stderrна stdout:

$ ./somecommad 2>&1 | less

Перевірте інструкцію щодо оболонки (наприклад, man bash)


1
Прокоментуйте нових читачів цього старого питання (особливо не для Йоахіма). Це те, що думають усі при першому скануванні питання. Але проблема більш тонка - дивіться обговорення в коментарях після відповіді
dmckee

Скорочення для 2> & 1 - | & . Таким чином, це можна спростити як$ ./somecommad |& less
Мелвін Авраам

1

просто скажіть оболонці перенаправити fd 2 на fd 1 (stderr to stdout)

 make 2>&1 | less

1

Одне, чого бракувало з усіх відповідей поки що, це причина, чому це відбувається. Проблема тут полягає в певній стані перегонів між процесом виведення матеріалів stderrі lessвідображенням виводу з stdoutтерміналу. Якщо lessпочинає показувати після виходу звуку stderrбуло надруковано на термінал, то lessзбереже , що і ви можете побачити повідомлення після виходу less. Якщо OTOH lessвже почав відображати речі, то повідомлення про помилки поєднуються з lessвисновком 's, і нічого не зберігається після lessвиходів (тому що lessпросто зберігає термінал таким, яким він був до запуску, і нічого не знає про повідомлення про помилки, що надходили між ними).

Ви можете це легко побачити, якщо зробите, наприклад

grep foo -r /etc | less

Усі повідомлення про помилки "Дозволено відмовлено" змішуються з lessрезультатами, і нічого не буде після виходу. Якщо ти зробиш

grep foo -r /etc | (sleep 10; less)

всі (або принаймні більшість) повідомлень про помилки були надруковані до терміналу, перш ніж lessз'явиться можливість відображення виводу, і ви побачите повідомлення про помилки згодом.

Звичайно, зазвичай не хочеться чекати 10 секунд перед початком less, але за допомогою Linux ви також можете поставити дробові значення часу очікування, а при швидких запущених процесах часто щось мало, що sleep 0.1достатньо, щоб уникнути стану гонки. (Але, звичайно, якщо ви хочете або повинні бути на справді безпечній стороні, використовуйте рішення RedGrittyBrick).


0

Вам потрібно зрозуміти поняття «дескриптори файлів». Зазвичай програма unix запускається з трьох спеціальних дескрипторів файлів:

  • Стандартний вхід
  • Стандартний вихід
  • Стандартна помилка

"Труба" |в оболонці з'єднується stdoutз одного процесу з stdinнаступного.

Помилки - за задумом - не подаються до stdinнаступного процесу. Вони часто не матимуть сенсу для наступного додатка і не повинні їх приховувати від користувача.

Якщо ви хочете змішати помилки в stdout, ви можете використовувати, наприклад 2>&1, що говорить по суті "додати stderr до stdout". Наприклад

find /etc 2>&1 | less

також повинен включати вихід помилок з важкодоступних файлів.

find /etc 2>&1 >/dev/null | less

видасть лише помилки


0

Я розгублений у вашому питанні, наскільки я можу сказати, що вам потрібна поведінка за замовчуванням.

Коли я використовую

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

щоб отримати простий тест,

$ ./testredirection | less

робить лише те, що ви просите. Це я бачу

1
3
5
7
9
(END) 

в lessі

$ ./testredirection | less
0
2
4
6
8
$ 

коли я кинув less


Дивно, але не завжди такі речі. Спробуйте зі скриптом ( echo info ; echo error 1>&2) і повторіть тест: обидва рядки є менш.
cYrus

@cYrus: Це працює, як і очікувалося, для мене. «Звичайно, я спробував у вікні Mac OS. Bash 3.2.17, менше 394. Можливо, щось специфічне для Linux. У будь-якому випадку підхід RedGrittyBrick повинен добре працювати.
dmckee --- кошеня колишнього модератора

Дивно! Debian Squeeze / Bash 4.1.5 / Менше 436
cYrus

Так, я відкрив оболонку наукової скриньки Linux 5.3 на роботі і отримав очікувану поведінку з bash 3.0.15 і менше 382. Чи може бути регресія там?
dmckee --- кошеня колишнього модератора

Я не знаю, я думаю, що це лише питання буферизації.
cYrus

0

Я випадково зіткнувся з цією проблемою в одному з моїх Debian 5.0 нещодавно. наприклад, ls abc | менше я вважаю, що повідомлення про помилку переходить на менше, що проти моїх знань.

Після деяких спроб я виявив, що це просто щось, що стосується буферів екрана. stderr НЕ впадає в менш фактично. Ви можете використовувати клавіші зі стрілками вгору або вниз (або j / k) для демонстрації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.