symlink.ch
Wissen Vernetzt - deutsche News für die Welt
 
symlink.ch
FAQ
Mission
Über uns
Richtlinien

Moderation
Einstellungen
Story einsenden

Suchen & Index
Ruhmeshalle
Statistiken
Umfragen

Redaktion
Themen
Partner
Planet

XML | RDF | RSS
PDA | WAP | IRC
Symbar für Opera
Symbar für Mozilla

Freunde
Benutzergruppen
LUG Switzerland
LUG Vorarlberg
LUGen in DE
SIUG
CCCZH
Organisationen
Wilhelm Tux
FSF Europe
Events
LinuxDay Dornbirn
BBA Schweiz
CoSin in Bremgarten AG
VCFe in München
Menschen
maol
Flupp
Ventilator
dawn
gumbo
krümelmonster
XTaran
maradong
tuxedo

 
*NIX-Tipp #1: Shell versus Terminalgrösse
Veröffentlicht durch tbf am Freitag 04. Februar 2005, 09:23
Aus der Es-sind-aber-127-Spalten! Abteilung
Braindump Grafische Terminals sind toll: Wie sonst sollte man mit laziv geräkelter Dame im Blick hacken. Ach ja, und man kann sie vergrösseren, um Platz für die vorbeirauschenden Hieroglyphen zu schaffen. Dumm nur, dass des Terminals zentrale Nutzerschnittstelle, die heissgeliebte $SHELL sich in einem Anflug von Nostalgie taub stellt, den neugewonnenen Platz ignoriert und weiter mit 80 $COLUMNS hantiert. Gerade im Zusammenspiel mit libreadline, verkommt so das Skripten des nächsten genialen Einzeilers zur Gedächtnis- und Geduldsprobe.

Die Frage ist nun, wie man dem Abhilfe verschafft. Neugierge Naturen, die sich über dieses Problem ärgern, werden schnell in /usr/bin ein Tool namens "resize" finden. Hmm, mal sehen, was es so tut:
mathias@dali mathias $ /usr/bin/resize
TERMCAP='xterm|X11 terminal emulator:kb=^?:kD=\[... kryptisch ...]';
export TERMCAP;
COLUMNS=127;
LINES=43;
export COLUMNS LINES;
mathias@dali mathias $
Cool, es kennt die neue Fenstergrösse! Doch nach kurzem Tippen die Ernüchterung: Die doofe $SHELL hat ja wieder mal garnix mitbekommen! Nach dreimaligem Kopfkratzen wird dem geübten $SHELL-Piloten aber klar, dass "resize" offenbar nur einige Variablen ausrechnet, die jetzt noch der $SHELL anvertraut werden müssen. Somit tippt er den zweiten Versuch:
mathias@dali mathias $ eval $(/usr/bin/resize)
mathias@dali mathias $
*tippel-tipp-tipp* - Hurra! Die $SHELL hat's gecheckt! Dumm nur, dass der Befehl von Hand ausgeführt werden muss. Wäre irgendwie cool, würden die Variablen mit jedem Prompt aufgefrischt. Das schöne ist, dass $SHELL für jeden erdenklichen Umstand Variablen besitzt, so besitzt die Bash z.B. die PROMPT_COMMAND-Variable, mit der man genau dies erzwingt. Schnell ein PROMPT_COMMAND='eval $(resize)' in die ~/.bashrc, und schon hilft das resize-Programm der Bash mit jedem Prompt auf die Sprünge. Liebhaber anderer $SHELLs haben sicher schon das passende Äquivalent parat. Leider hat diese Lösung einen Haken: resize ist ein externes Binary, somit dauert der Start einige Millisekunden. An die etwas entschleunigte $SHELL-Experience könnte man sich sicher noch gewöhnen. Dummerweise aber ist der Start manchmal derart verzögert, dass resize eigentlich für $SHELL bestimmte Tastenanschläge frisst. Verdammt ungeschickt!

In dieser Situation angekommen hilft nur noch eines: "use the force, read the source". Stellt sich die Frage welcher. In der Bash nach dem Resize-Detektor suchen ist sicher nervig, zumal der ja sicher kaputt ist (wie ich zu diesem Zeitpunkt dachte). Ein rationaler Mensch hätte sich jetzt evtl. dem Quellcode des kleinen resize-Tools zugewandt. Ich bin kein rationaler Mensch, also ist mir dieser Punkt entgangen. Ausserdem hatte ich auch meinen Terminal-Emulator im Verdacht, also habe ich mir libvte ausgepackt und nach "resize" gegrept.

mathias@dali vte-0.11.11 $ fgrep -c resize src/*.c | fgrep -v :0
src/pty.c:1
src/reflect.c:1
src/vteapp.c:7
src/vtebg.c:4
src/vte.c:31
src/vteft2.c:1
src/vtergb.c:1
mathias@dali vte-0.11.11 $
Die Datei mit dem Namen "pseudo terminal driver punkt makroassembler" ist natürlich hochgradig verdächtig - und voilà:
/**
 * vte_pty_set_size:
 * @master: the file descriptor of the pty master
 * @columns: the desired number of columns
 * @rows: the desired number of rows
 *
 * Attempts to resize the pseudo terminal's window size.  If successful, the
 * OS kernel will send #SIGWINCH to the child process group.
 *
 * Returns: 0 on success, -1 on failure.
 */
WOW! Alles was ich machen muss, um die $SHELL von der neuen Terminalgrösse zu informieren, ist der Shell das WINCH-Signal zu schicken? Ausprobieren!
mathias@dali vte-0.11.11 $ eval $(resize); echo $COLUMNS; python; echo $COLUMNS
127
Python 2.3.4 (#1, Oct 22 2004, 05:32:04)
[GCC 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> Fenstergrösse wiederherstellen, danach <C-D>
127
mathias@dali vte-0.11.11 $
Ok, dieser Test taugt, denn zum Zeitpunkt der Grössenänderung besitzt Python das PTY, erhält somit das Signal. Die $SHELL geht leer aus. So, und jetzt mit WINCH-Signal:
mathias@dali vte-0.11.11 $ eval $(resize); echo $COLUMNS; python; kill -WINCH $$ ; echo $COLUMNS
80
Python 2.3.4 (#1, Oct 22 2004, 05:32:04)
[GCC 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
127
mathias@dali vte-0.11.11 $
Es hat geklappt, es hat geklappt! Hätte jeden in meiner Nähe abknutschen können, als dies gelungen war! Endlich kenne ich die Ursache für das Problem (SIGWINCH wird immer nur an den PTY-Owner verschickt) und auch Abhilfe! Da "kill" nämlich ein in der Shell verbauter Befehl ist, arbeitet der folgende PROMPT_COMMAND genau wie gewünscht, lösst all die Resize-Problem:
PROMPT_COMMAND='kill -WINCH $$'

So, danke fürs bis zum Ende lesen: Hoffe es war nützlich.
Bei Gefallen, gibt's weitere *NIX-Tipps.

Attacken auf Googles Werbesystem | Druckausgabe | Backup? Kein Problem mit Shellskripten!  >

 

 
symlink.ch Login
Login:

Passwort:

extrahierte Links
  • Gentoo
  • Linux
  • Python
  • Slashdot
  • Mehr zu Braindump
  • Auch von tbf
  • Kolumnen
  • April, April
  • Stupidedia: freie und sinnlose Enzyklopädie
  • Pimp my Firefox: Tuning mal anders
  • UNIX-Timestamp 1111111111
  • OSS Rechte einfordern
  • Umfrage, Werbung oder Beschiss?
  • Softwarepatente: So geht es weiter
  • Casemodding aus Not oder "Kinderfreuden"
  • FOSDEM Tag 2 - Deutsch, Flämisch und Wallonisch
  • FOSDEM: Tag 1 - Es ist kalt in Brüssel
  • Diese Diskussion wurde archiviert. Es können keine neuen Kommentare abgegeben werden.
    2 Fragen (Score:2)
    Von brummfondel am Friday 04. February 2005, 09:37 MEW (#1)
    (User #784 Info)
    Warum schickst Du ein Signal 15 an die Shell bei jedem Prompt? Ich dachte, es sollte ein Winch sein.

    2. Warum diese Mühen? Ok, ist interessant. Aber irgendwie klappt das doch auf modernen Unix-Systemen so schon gut. Jedenfalls ein vi in einem dtterm paßt sich der Größe an und die Shell danach auch.

    --
    ok> boot net - install
    Re: 2 Fragen (Score:1)
    Von tbf am Friday 04. February 2005, 10:14 MEW (#5)
    (User #21 Info) http://taschenorakel.de/
    Warum schickst Du ein Signal 15

    Weil ich mich am Ende des Textes vertippt habe. :)
    Das ultimative PROMPT_COMMAND ist natürlich "kill -WINCH $$", nicht "kill $$".

    2. Warum diese Mühen?
    Ja sicher, das Programm im Vordergrund bekommt die Änderung immer wunderbar mit, wo's aber happert ist die Shell, mit der Du den vi gestartet hast: Der Terminal-Emulator schickt ein ioctl den Terminal-Treiber. Der Kernel schickt daraufhin ein Signal an den aktuellen PTY-Besitzer (in Deinem Fall vi). Der PTY-Besitzer sollte das Signal jetzt wahrscheinlich weiterleiten an das startende Programm (oder so), nur macht dies kaum eines. Resultat: Die Shell bricht beim Befehlseditieren sonstwo um, nur nicht am Zeilenende.

    Das explizite WINCH-an-die-Shell-Schicken wurstelt um dieses Problem herum.

    --
    Addicted by code poetry...
    Re: 2 Fragen (Score:0)
    Von Anonymer Feigling am Friday 04. February 2005, 10:20 MEW (#9)
    Hm, also ich hab hier die KDE-Konsole auf: "less test.txt" lässt sich wunderbar resizen, genauso "vi test.txt". Alle Zeilen werden länger oder kürzer in "Realtime". Vielleicht steige ich immer noch nicht durch.
    Re: 2 Fragen (Score:0)
    Von Anonymer Feigling am Friday 04. February 2005, 11:22 MEW (#16)
    Hast halt wohl nicht Debian Stable steinzeit installiert :-)
    Re: 2 Fragen (Score:0)
    Von Anonymer Feigling am Sunday 06. February 2005, 00:40 MEW (#30)
    mach folgendes: gebe eine sehr lange komando ein , die über mehrere zeielen geht. fuerh es aus. Dann resize das fesnter und gehe in der history(pfeil auf) zurueck. Da bekomme ich schon problemme, da die zeiele nicht komplett zu sehen ist.
    Re: 2 Fragen (Score:2)
    Von brummfondel am Friday 04. February 2005, 10:23 MEW (#11)
    (User #784 Info)
    Hm, ich muß zuegeben, ich ändere die Fenstergröße sowieso kaum bis nie und wenn doch, dann immer nur im Prompt, fast niemals, wenn ein Programm darin läuft. Vermutlich, weil ich genau die geschilderten Erfahrungen gemacht habe.

    Da ich mir das aber genau so angewöhnt habe, merke ich dieses Problem nie (zumal manche Programme gar nicht begeistert über das WINCH-Signal zu sein scheinen und dann alles andere, nur nichts sinnvolles machen).

    Wandert dieses Signal auch zu einem fernen pty über Telnet bzw. SSH?

    --
    ok> boot net - install
    Re: 2 Fragen (Score:2)
    Von brummfondel am Friday 04. February 2005, 10:14 MEW (#7)
    (User #784 Info)
    Ok, jetzt ist es ein WINCH (oder war es das wirklich von Anfang an? Dann muß ich mir für nächste Woche einen Termin beim Augenarzt geben lassen.).

    --
    ok> boot net - install
    Hm? (Score:0)
    Von Anonymer Feigling am Friday 04. February 2005, 09:40 MEW (#2)
    Ich glaub ich kapier das Problem nicht, dass du da mit viel Aufwand gelöst hast. Welche Shell kann denn bei dir von zu Hause aus nicht mehr als 80 Zeichen pro Zeile schlucken? Bei mir geht das sowohl auf den virtuellen Konsolen (Ctrl+Alt+F1..F6) wie auch unter den "GUI-Shells" von KDE und Gnome. Erleuchtung gesucht! (Aber interessanter Artikel, möchte ich noch angefügt haben.)
    Re: Hm? (Score:2)
    Von db (001@nurfuerspam.de) am Friday 04. February 2005, 10:13 MEW (#4)
    (User #1177 Info) http://www.bergernet.ch
    Das ist so gedacht:

    - shell öffnen
    - arbeiten
    - shell-window resizen
    - weiter arbeiten *peng* - hier merkt die shell nicht* dass mehr platz da wäre

    *) naja so aus dem Gefühl behauptet geht das in der Konsole von KDE mit bash schon lange...
    Re: Hm? (Score:1)
    Von tbf am Friday 04. February 2005, 10:16 MEW (#8)
    (User #21 Info) http://taschenorakel.de/
    Wenn Du die Grösse änderst, während die Shell auf Input wartet, ja dann klappt das. Wenn Du die Grösse änderst, während ein von der Shell gestartetes Programm an STDIN lauscht, geht's in die Hose.
    --
    Addicted by code poetry...
    Re: Hm? (Score:2)
    Von brummfondel am Friday 04. February 2005, 10:25 MEW (#12)
    (User #784 Info)
    Gibt es kein "execute after command" in der Shell? Mich stört irgendwie der Kill-Befehl im Prompt (dabei ist der Ort schon passend).

    --
    ok> boot net - install
    Re: Hm? (Score:2)
    Von db (001@nurfuerspam.de) am Friday 04. February 2005, 10:47 MEW (#15)
    (User #1177 Info) http://www.bergernet.ch
    aah *plig* *erleuchtung*

    - In dem Fall wird das Lob um Faktor 1.7777779 erhöht!
    Danke für die Lösung, aber wo ist das Problem? (Score:1)
    Von stw (stephan at walter dot name) am Friday 04. February 2005, 10:00 MEW (#3)
    (User #940 Info) http://stephan.walter.name/
    Ich schliesse mich den beiden Vorpostern an: WIESO? Wenn du eine solche Bastelei veranstalten musst, damit deine Shell die Grössenänderung mitbekommt, ist dein System ziemlich vermurkst.

    Oder dann habe ich völlig missverstanden, was du erreichen wolltest...

    Re: Danke für die Lösung, aber wo ist das Problem? (Score:1)
    Von tbf am Friday 04. February 2005, 10:20 MEW (#10)
    (User #21 Info) http://taschenorakel.de/
    Sie oben: Das Signal landet immer nur beim Prozess, der gerade Input verabeitet. Wenn beim Resizen also irgendein anderes Programm im Vordergrund hängt, sei es vim, sei es top, sei es was uninteraktives wie make, geht die Shell leer aus und produziert beim Befehlszeile editieren Murks. Auf jedem Linux, auf jedem Unix, dass ich ausprobiert habe.
    --
    Addicted by code poetry...
    Lob (Score:2)
    Von db (001@nurfuerspam.de) am Friday 04. February 2005, 10:14 MEW (#6)
    (User #1177 Info) http://www.bergernet.ch
    Ein echtes Lob - so einen praktischen Artikel gabs bei Symlink schon lange nicht!

    Hab leider das Know-how nicht um selbst sowas zu verfassen..
    Brauchbar! (Score:2)
    Von brummfondel am Friday 04. February 2005, 10:28 MEW (#13)
    (User #784 Info)
    So, nachdem ich jetzt den Sinn und die Notwendigkeit verstanden habe:

    Warum ist das nicht schon Standardmäßig drin? Daß ein WINCH wohl nicht von Programmen an die Shell weitergereicht wird, ist wohl schon länger bekannt. Und wenn die Lösung so einfach ist, warum nicht schon immer so....

    --
    ok> boot net - install
    Re: Brauchbar! (Score:1)
    Von maxy am Friday 04. February 2005, 11:47 MEW (#17)
    (User #795 Info)
    Ja, auch hezlichen Dank für den Artikel. Hatte das Problem schon oft, aber mich nie genug geärgert um ihm nachzugehen.

    Sowas sollte eigentlich wirklich per default funktionnieren. Ein Bash-Bug?

    Re: Brauchbar! (Score:1)
    Von maxy am Friday 04. February 2005, 12:09 MEW (#18)
    (User #795 Info)
    Hm... Das Problem scheint auf debian testing nur bei ssh-Verbindungen aufzutreten (ssh localhost).
    Oder einfacher (Score:2)
    Von blindcoder (symlink@scavenger.homeip.net) am Friday 04. February 2005, 10:40 MEW (#14)
    (User #1152 Info)
    Oder man kann es sich auch einfach machen und nach terminalgroessenaenderungen einfach ^L druecken.
    Schickt ein SIGWINCH an das entsprechende Programm und die Sache ist erledigt.
    Warum so kompliziert? (Score:3, Informativ)
    Von tL (sümlink bei frozenbrain punkt com) am Friday 04. February 2005, 12:16 MEW (#19)
    (User #981 Info) http://www.frozenbrain.com
    Ok, ich bin auch erst durch den Tip auf die Idee gekommen; das Problem hat mich jahrelang genervt, allerdings zu wenig um mich dahinter zu setzen. Seit dem letzten Bash-Update geht's jedoch problemlos. Also mal
    # vi /etc/bash/bashrc
    /WINCH
    eingegeben und voila:

    # Bash won't get SIGWINCH if another process is in the foreground.
    # Enable checkwinsize so that bash will check the terminal size when
    # it regains control. #65623
    # http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11)
    shopt -s checkwinsize


    Cool. Ich weiss jetzt leider nicht, ob das auch mit älteren Bashen geht, oder ob andere Shells ähnliche Befehle haben. Aber für die Basher ist das hier wohl fast die edelste Lösung. IMHO.


    tL

    --
    ... I don't like it, but I guess things happen that way ... (J. Cash)
    Re: Warum so kompliziert? (Score:1)
    Von maxy am Friday 04. February 2005, 13:10 MEW (#23)
    (User #795 Info)
    > shopt -s checkwinsize

    Aha! Das ist per default eingeschaltet. Allerdings nicht, wenn ich via ssh komme:

    martin@bazaar:~$ shopt | grep checkwinsize
    checkwinsize on
    martin@bazaar:~$ ssh localhost
    (...blah...)
    martin@bazaar:~$ shopt | grep checkwinsize
    checkwinsize off

    Hat jemand eine Erklärung dafür? (debian testing; wenn es im .bashrc gesetzt wird geht's natürlich)

    Re: Warum so kompliziert? (Score:1)
    Von maxy am Friday 04. February 2005, 14:03 MEW (#24)
    (User #795 Info)
    Ich antworte mir halt wieder selbst ;)

    Debian hat die Option im /etc/bash.bashrc drin; dieses scheint beim ssh login nicht ausgeführt zu werden. Ich schreibe mal den bash-leuten ob sie das nicht default machen können.

    Re: Warum so kompliziert? (Score:2)
    Von tL (sümlink bei frozenbrain punkt com) am Friday 04. February 2005, 14:17 MEW (#25)
    (User #981 Info) http://www.frozenbrain.com
    Möglicherweise, weil Login- und normale Shells verschieden initialisiert werden. Siehe die FILES-Section von "man bash".

    Bei mir werden folgende Scripts ausgeführt:
    Login-Shell:
    /etc/profile
    /etc/bash/bashrc


    "Normale" Shell:
    /etc/bash/bashrc
    ~/.bashrc




    tL

    --
    ... I don't like it, but I guess things happen that way ... (J. Cash)
    warum in $SHELL arbeiten... (Score:-1, Troll)
    Von Anonymer Feigling am Friday 04. February 2005, 12:22 MEW (#20)
    ...wenn es doch GNOME gibt?

    ich habe die Shell schon seit Jahren nicht mehr gebraucht. Auf underen Servern läuft Webmin und GNOME. Hallo wir leben im 2005, wir leben in der Grafik!

    Shell ist vom letzten Jahrtausend

    Re: warum in $SHELL arbeiten... (Score:1)
    Von Sensemann am Friday 04. February 2005, 12:35 MEW (#21)
    (User #798 Info)
    das rad glaub vom vorletzten oder so ;)
    Re: warum in $SHELL arbeiten... (Score:1)
    Von tbf am Friday 04. February 2005, 12:57 MEW (#22)
    (User #21 Info) http://taschenorakel.de/
    Warum schwarz und weiss? Statt sich auf ein Paradigma ($SHELL vs. Klickibund), sollte man doch einfach immer das Paradigma nutzen, welches gerade am brauchbarsten erscheint. Wenn's stark testlastig ist, was man gerade erledigen will, ist die $SHELL unschlagbar. Am System herumbasteln, fremden Code erforschen, Dateien suchen, geht wunderbar in der $SHELL, ist kennt man seinen Werkzeugkasten extrem effizent und macht mangels Frustmomenten sogar spass. Zum Bilderverwalten hingegen sind Nautilus und gphoto grandious. Musik spielt sich super mit Goobox und Muine. Compilieren von eigenem Code geht wesentlich komfortabler aus der IDE heraus (gVim, $whatever, ...).
    --
    Addicted by code poetry...
    Re: warum in $SHELL arbeiten... (Score:0)
    Von Anonymer Feigling am Friday 04. February 2005, 14:30 MEW (#26)
    Please do not feed the trolls...
    Re: warum in $SHELL arbeiten... (Score:3, Tiefsinnig)
    Von Seegras am Friday 04. February 2005, 14:40 MEW (#27)
    (User #30 Info) http://www.discordia.ch
    Was immer am besten geht, geht am besten, auch wenn man sich auf ein neues Paradigma einstellen muss. Und es ist nun mal nicht so dass sich Terminal und GUI beissen.

    Man ist ganz einfach am schnellsten wenn man für die Aufgabe das richtige Tool benutzt. bei mir teilweise GUI, teilweise Kommandozeile, und teilweise den Speed-King "midnight commander" (jep, viele Aufgaben gehen mit dem locker Faktoren schneller wie nur mit der Kommandozeile), ebenfalls im Terminal.

    Die Shell ist ein mächtiges Werkzeug, und wer das Gefühl hat die sei nun nutzlos weil man gewisse Dinge per Mausclick lösen kann ist einfach nur dumm. "Ich hab nun eine Motorsäge, da brauch ich kein Taschenmesser mehr"
    "The more prohibitions there are, The poorer the people will be" -- Lao Tse
    Re: warum in $SHELL arbeiten... (Score:2)
    Von brummfondel am Saturday 05. February 2005, 13:59 MEW (#29)
    (User #784 Info)
    Schonmal Solaris Jumpstart benutzt?

    --
    ok> boot net - install
    Sehr guter Tipp (Score:1)
    Von esden am Friday 04. February 2005, 15:42 MEW (#28)
    (User #1105 Info)
    ich habe mich schon laenger mit dem Problem rumgeschlagen. Habe aber mir nicht die Zeit genommen das Problem zu loesen. Uhrsache war mir klar aber nicht die Loesung.

    Ich hoffe es kommen mehr solche Tipps bei Symlink!

    Linux User Group Schweiz
    Durchsuche symlink.ch:  

    Never be led astray onto the path of virtue.
    trash.net

    Anfang | Story einsenden | ältere Features | alte Umfragen | FAQ | Autoren | Einstellungen