Seguindo o resultado do comando dmesg

Encontrei uma solução para rastrear o resultado do comando dmesg em tempo real. A solução é aqui.

watch -n 0.1 "dmesg | tail -n $((LINES-6))"
Funciona. Mas eu quero entender por que $(Linhas-6) funciona corretamente em vez de $linhas.

Obrigado.

Author: Community, 2015-09-04

2 answers

$(($LINE - 6)) substract 6 to $LINE ' s value and return the result.

Editar:

Quando se usa bash (e proabababably outra shell)

   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.

Em resumo, as linhas são fornecidas por si xterm ou putty para indicar as linhas e o número da coluna.

 0
Author: Archemar, 2015-09-07 09:01:25

Eu quero entender por que $(Linhas-6) funciona corretamente em vez de $LINHAS.

A razão tem duas partes.
  1. watch mostra um cabeçalho seguido por uma linha em branco, pelo que terá de subtrair 2 do número de linhas de ecrã disponíveis (ou usar a opção -t para desligar o cabeçalho).
  2. Algumas linhas de saída dmesg são mais compridas do que a largura do ecrã, ocupando assim mais do que uma linha de ecrã. Já que tail -n não explica isso. mas ao invés disso conta linhas lógicas independentemente de seu comprimento, ele pode entregar mais linhas na tela do que solicitado, e watch exibe apenas o primeiro screenfull deles, perdendo o resto (4 em seu caso de teste). Para remediar isso, você pode embrulhar as linhas dmesg para caber na largura do ecrã antes de as alimentar a tail -n, por exemplo:

    watch "dmesg | fold -w$COLUMNS | tail -n$((LINES-2))"
    
 0
Author: Armali, 2016-01-08 09:25:09