Volker Englisch <
v...@quantentunnel.de> writes:
>Michael van Elst schrieb am 29.10.2022:
>> Volker Englisch <
v...@quantentunnel.de> writes:
>>
>>>Von FreeBSD kenne ich es so, dass es zu jedem tty ein .lock-File gibt,
>>>um serielle Parameter "festzuschweissen". Gibt es unter NetBSD dazu auch
>>>eine Möglichkeit?
>>
>> Auch bei FreeBSD kann jeder, der Zugriff auf das tty hat, dessen
>> Einstellungen ändern.
>Okay... Was genau bringt dann das /dev/ttyXX.lock Device?
Es hilft dagegen, dass Programme die Einstellungen einfach mit termios
verändern.
>> Der NetBSD tty-Treiber setzt erase=^? als Default.
>>
>> Wenn auf einem tty getty gestartet wird (steht in /etc/ttys), dann
>> kann über /etc/gettytab der VERASE character geändert werden. Das
>> ist vielleicht der sinnvollste Ort für die Konfiguration eines
>> seriellen Terminal.
>$TERM ist vt220. In /usr/share/misc/terminfo steht bei vt220:
>ech=\E[%p1%dX und cub1=^H
>Was auch immer der Escape-Code bei ech bedeutet, nach einem tset passt
>eigentlich alles.
Das meiste in terminfo gibt Steuerzeichen an, die man ausgeben muss.
ech z.B. gibt eine Sequenz an, die ein Zeichen auf dem Bildschirm löscht.
cub1 gibt die Sequenz an, die man braucht um den Cursor nach links
zu bewegen.
Es gibt aber auch Attribute, die sagen, was bestimmte Tasten
produzieren.
kdch1 wäre die Sequenz, die die "delete-character"-Taste erzeugt.
% tput -T vt220 kdch1 | hexdump -C
00000000 1b 5b 33 7e |.[3~|
00000004
kbs wäre die Sequenz, die die "backspace"-Taste erzeugt.
% tput -T vt220 kbs | hexdump -C
00000000 08 |.|
00000001
Mit tset (und TERM=vt220) wird dem Terminaltreiber also gesagt,
dass ein ^H das zuletzt eingegebene Zeichen löschen soll. Du
könntest auch 'stty erase ^H' aufrufen für denselben Effekt.
Früher war der tset-Aufruf in .profile bzw. .cshrc. Aber da heutzutage
kaum jemand Hardware-Terminals verwendet, ist das eher ein Problem,
da die Zuordnung der "Backspace"-Taste nichts mehr mit $TERM zu
tun hat. Bei einem ssh-Login z.B. wird die Einstellung der Clientseite
unabhänggig von $TERM übernommen und TERM ist überall meistens 'xterm'.
Ein 'tset' hätte gute Chancen etwas falsches einzustellen.
>> "Moderne" shells mit Eingabeeditoren verwenden den canon-Modus nicht
>> und behandeln ^H und ^? oft identisch. Eine inkonsistente Einstellung
>> bemerkt man dann nur bei aufgerufenen Kommandos.
>Dann wäre stty -icanon vielleicht einen Versuch wert.
Der canon-Modus ist der normale zeilenbasierte Eingabemodus, bei
dem es so etwas wie Backspace überhaupt gibt. Wenn ein Programm
(wie eine Shell mit Eingabeeditor, oder ein Programm mit Textmenus,
oder ein Fullscreen-Editor) die Eingaben direkt übernimmt (raw-Modus,
oder cbreak-Modus), dann muss das Programm eben auf einzelne
Tastendrücke selbst reagieren. Einfach den canon-Modus abschalten
führt zu nichts, auch weil die Shell das wieder selbst steuert
und auch normale interaktive Programme bekommen den canon-Modus.
Wenn man Hardware-Terminals verwendet, dann benutzt ein Anwender
'tset' und hat das Problem remote-Logins anders zu behandeln.
Klassich wäre TERM=network und der Anwender würde seinen Terminaltyp
bei jedem Einloggen angeben müssen. Wäre heutzutage sicher auch eine
seltsame Vorstellung.
Wenn du fest verbundene Terminals hast, dann ist die gettytab die
Lösung. In /etc/ttys gibst du getty als Parameter einen Typ mit
statt "default" oder "Pc". Und in gettytab definierst du zu dem
Typ die passenden Einstellungen.
Komplizierter wird es, wenn dein Hardware-Terminal nicht mit terminfo
übereinstimmt. Die Terminals kann man oft auch umkonfigurieren oder
du hast einen 99%ten Nachbau. Dann bräuchtest du noch einen weiteren
angepassten Eintrag in terminfo, damit alles konsistent bleibt.