2015-09-04 3 views
0

Я нашел решение для отслеживания вывода команды dmesg в режиме реального времени. Решение - here.После вывода команды dmesg

watch -n 0.1 "dmesg | tail -n $((LINES-6))" 

Это работает. Но я хочу понять, почему $ ((LINES-6)) работает правильно, а не $ LINES.

спасибо.

+0

Вы уверены, что $ LINES не работают? Я вижу его работу. –

+0

Я сравнил два результата между «watch -n 0.1» dmesg | tail -n $ LINES "и" dmesg "на Ubuntu. $ LINES теряет последние 6 строк вывода. – LZh

+0

Я только что проверил корпус, подключив USB к ПК. – LZh

ответ

0

$(($LINE - 6)) Прибавка от 6 до $LINE и возврат результата.

Edit:

при использовании Баша (и proabably другой оболочки)

LINES Used by the select compound command to determine the column 
      length for printing selection lists. Automatically set if the 
      checkwinsize option is enabled or in an interactive shell upon 
      receipt of a SIGWINCH. 

короче, ЛИНИИ предоставляются вам xterm или putty дать ЛИНИИ и номер столбца.

+0

Не могли бы вы рассказать мне, откуда берется стоимость $ LINE? Я не могу найти информацию об этом. – LZh

0

Я хочу понять, почему $ ((LINES-6)) работает правильно, а не $ LINES.

Причина состоит из двух частей.

  1. watch отображает заголовок с последующим пустой строкой, поэтому вам нужно вычесть 2 из числа строк экрана, доступных (или используйте опцию -t отключить заголовок).
  2. Некоторые линии вывода dmesg длиннее ширины экрана и, таким образом, занимают более одной линии экрана. Поскольку tail -n не учитывает это, а скорее подсчитывает логические строки независимо от их длины, он может доставлять больше строк на экране, чем запрашивалось, а watch отображает только первый экран, теряя остальные (4 в тестовом примере). Чтобы исправить это, вы можете обернуть dmesg линии, чтобы поместиться в ширину экрана перед подачей их на tail -n, например:

    watch "dmesg | fold -w$COLUMNS | tail -n$((LINES-2))" 
    
Смежные вопросы