janela de console serial redimensionável?

22

Ao usar o console serial do meu sistema, sempre acabo com $COLUMNS=80 e $LINES=24 .

Embora eu possa alterar essas variáveis manualmente, é um tanto irritante fazer isso a qualquer momento quando a janela do terminal do lado do cliente foi redimensionada.

Geralmente estou conectando ao console usando screen /dev/mytty baudrate .

A alteração da variável de ambiente $TERM para "screen" ou "xterm" não ajuda.

Precisarei chamar getty com alguns desses em vez de vt100?

Escusado será dizer que tudo isto funciona bem, quando me conecto à mesma máquina usando ssh.

    
por Sven Geggus 13.07.2011 / 11:33

6 respostas

22

Como os comentaristas antes de mim mencionaram, não há alternativa para chamar resize após cada comando, se você não tiver esse comando e não quiser instalar um pacote no qual ele está ( xterm ), aqui são dois shell script POSIX que fazem o mesmo usando códigos de escape do terminal ANSI:

res() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '373[r3[999;999H3[6n38' > /dev/tty
  IFS='[;R' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}

res2() {

  old=$(stty -g)
  stty raw -echo min 0 time 5

  printf '3[18t' > /dev/tty
  IFS=';t' read -r _ rows cols _ < /dev/tty

  stty "$old"

  # echo "cols:$cols"
  # echo "rows:$rows"
  stty cols "$cols" rows "$rows"
}
  • res é baseado na solução apresentada no link . Funciona da seguinte forma:

    1. A posição do cursor é salva ( 37 , DECSC ).
    2. Os cursores são movidos para o ponto mais inferior direito possível ( 3[r3[999;999H , DECSTBM ? + CUP ).
    3. A posição do cursor é informada ( 3[6n , DSR ).
    4. O cursor é movido de volta para a posição salva anteriormente ( 38 , DECRC ).
  • res2 é influenciado por resize.sh do xterm (consulte link ). Ele usa um código xterm específico para obter as informações que desejamos (implementadas em muitos emuladores de terminal), consulte: ""

    <> Relatório do tamanho da área de texto em caracteres. ").

BTW, no meu arquivo .profile , você encontrará o seguinte: %código% de modo que o tamanho do terminal seja determinado em cada login pela linha serial (aquela que eu uso para gerenciamento), e. depois de reiniciar o dispositivo.
Veja também a idéia de rsaw nos comentários para ter a linha [ $(tty) = /dev/ttyS0 ] && res lá Em vez disso, o redimensionamento é executado após cada comando (observe que o AFAIK nem sempre é possível no [ $(tty) = /dev/ttyS0 ] && trap res2 DEBUG ).

    
por 14.05.2016 / 23:52
14

Apenas para o registro, aqui está a resposta para este problema (Usenet ganhou):

Console Os aplicativos em execução nos aplicativos de terminal virtual ( xterm , rxvt e amigos) receberão SIGWINCH após uma operação de redimensionamento. Assim, o aplicativo será capaz de redesenhar a janela etc. no manipulador de sinal correspondente.

Infelizmente, ao usar um console serial, não existe esse mecanismo.

No entanto, é possível que o aplicativo solicite ativamente o tamanho da janela do console atual . Então, a segunda melhor coisa é fazer isso toda vez que um prompt de comando for impresso pelo shell.

No bash isso pode ser conseguido usando o seguinte em bashrc :

if [ $(tty) == '/dev/ttyS0' ]; then
  trap resize DEBUG
fi

O código fonte real do comando de redimensionamento pode ser encontrado aqui .

Claro que isso não alterará as configurações de tamanho do console em um aplicativo de console durante o tempo de execução.

    
por 23.08.2011 / 15:49
7

Os terminais "redimensionáveis", como tal, são resultado do NAWS ( Negotiate About Window Size em RFC 1073 Opção de Tamanho da Janela de Telnet ).

Se você estiver conectado diretamente ao computador usando uma porta serial, não haverá negociação envolvida e o computador não terá conhecimento direto do tamanho da tela do seu terminal.

Se um terminal puder negociar o tamanho, o computador enviará SIGWINCH para os aplicativos em execução no terminal, avisando-os para atualizar sua noção do tamanho do ecrã.

Quando o computador não conhece o tamanho da tela, normalmente define o tamanho mostrado por stty -a (linhas e colunas) como zero. Para uso interativo, isso é um pouco hostil, e alguns sistemas usam variáveis de ambiente LINES e COLUMNS para ajudar. Os valores atribuídos podem ser derivados da descrição do terminal; mais frequentemente eles são simplesmente codificados. A convenção para essas variáveis requer que elas sejam efetivadas a menos que sejam explicitamente suprimidas, por exemplo, em aplicações maliciosas % funçãouse_env . No lado positivo, essas variáveis podem ser úteis quando não há informações confiáveis disponíveis. Do lado negativo, não há método conveniente para alterar essas variáveis.

O programa resize (um utilitário fornecido com xterm ) pode usar a seqüência de escape do relatório de posição do cursor no estilo VT100 para determinar o tamanho da tela. Isso pode ser executado a partir da linha de comando; não há (novamente) nenhuma maneira conveniente de fazer isso automaticamente. Como um efeito colateral, resize atualiza as informações sobre linhas / colunas vistas por stty . Seu uso para fornecer variáveis de ambiente atualizadas é útil principalmente para casos como este, em que LINES e COLUMNS são definidos e devem ser atualizados.

    
por 17.02.2016 / 11:33
3

Aqui está outra solução que funcionou muito bem para mim no meu sistema Linux embarcado (Overo executando o Angstrom). Acabei de executá-lo do meu arquivo .bashrc. Eu não queria usar o redimensionamento porque isso requer a instalação de alguns pacotes X, e eu não queria isso.

Dizendo ao seu Raspberry Pi que o seu terminal é maior que 24 linhas | Blog de pensamentos rasos

    
por 03.05.2014 / 00:02
1

Caso você possa usar o FreeBSD, existe o comando resizewin (1) , que faz exatamente o que você quer.

    
por 06.11.2017 / 12:13
1

Ao executar uma sessão de shell através de uma linha serial, basta chamar o comando resize dentro dessa sessão - depois de estabelecer a conexão e após cada mudança na geometria do terminal.

O comando resize faz parte do xterm, mas não depende do X11. Por exemplo, no Fedora é empacotado separadamente como xterm-resize .

Como funciona: o comando resize mede a altura / largura através de alguns movimentos do cursor e, em seguida, envia esses valores para o terminal através de seqüências de escape.

Com um shell como zsh, isso também atualiza automaticamente as variáveis LINES e COLUMNS (alternativamente, é possível avaliar as declarações de exportação que os comandos imprimem para stdout).

Por que isso é necessário: com uma sessão local ou ssh, o terminal pode sinalizar a sessão sobre mudanças de geometria (cf. SIGWINCH). Esse mecanismo não funciona em uma conexão serial.

    
por 07.03.2018 / 15:39