Rätsel: Terminal/bash/ncurses wie funktioniert $COLUMNS und $LINES?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Rätsel: Terminal/bash/ncurses wie funktioniert $COLUMNS und $LINES?

    $COLUMNS und $LINES passen sich in der shell ja automatisch an, wenn man ein Terminal-Fenster größer oder kleiner macht.

    Nur welcher Kommunikations-Mechanismus wird da verwendet?
    Fragt die Shell das Terminal (woher weiß sie ob sie in einem Terminal läuft oder ohne) oder sendet das Terminal "versteckte" Befehle (export COLUMNS=123) an die Shell?
    Kennt evtl. jemand von Euch wo in der Doku von Apple etwas über die $COLUMNS und $LINES-Variablen steht?
    Gibt es ein Open-Source-Terminalprogramm das das ebenfalls kann?

    Sachdienliche Hinweise willkommen :)

    Danke,
    hns

    PS: ich will ein Terminalfenster in einer Applikation implementieren - und das sollte auch COLUMS/LINES korrekt setzen.
  • Danke! Das war für den Einstieg ein sehr guter Tip.

    Es scheint aber noch ein bischen anders zu laufen (zumindest nach der angelesenen Theorie): Das Terminal macht anscheinend einen ioctl mit TIOCSWINSZ und weist der (p)tty eine neue Fenstergröße zu. Das SIGWINCH erzeugt der Kernel automatisch und schickt es an alle Prozesse aus der process group.

    Und die Shell (oder andere Programme, z.B. auf ncurses basierende wie der vi) kann das abfangen und dann mit TIOCGWINSZ die neuen Größen auslesen. D.h. das Terminal wird nicht über irgendwelche ESC-Sequenzen abgefragt.

    Interessanterweise macht ssh sogar ein Forwarding für das SIGWINCH und TIOCSWINSZ. Sonst könnte man sich im Terminal nicht per ssh mit einem anderen Rechner verbinden und dort ebenfalls COLUMNS und LINES über die Fenstergröße verändern.
  • Also dieses Code-Fragment reicht (sofern stdinput ein pty-Device ist an dessen anderem Ende die Shell lauscht):

    Quellcode

    1. struct winsize sz;
    2. sz.ws_row=rows;
    3. sz.ws_col=cols;
    4. sz.ws_xpixel=0;
    5. sz.ws_ypixel=0;
    6. NSLog(@"new size: COLUMNS=%u LINES=%u", cols, rows);
    7. if(ioctl([stdinput fileDescriptor], TIOCSWINSZ, &sz))
    8. NSLog(@"error: %s", strerror(errno));


    Interessanterweise schickt die Shell dann eine ESC-Sequenz "clear to end of line". Vielleicht sicherheitshalber...

    Danke für den Tip,
    hns

    EDIT: Nachtrag - der Code geht auf 10.6.8 aber nicht auf 10.9.4 :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von hns ()