Programmierfehler Debian
Gnome
Hier schreibe ich als Anfänger über meine Probleme mit Debian auf einem 64-bit Computer. Der Monitor-Bildschirm bei einer Auflösung von 1280x720 war um ca. 4cm nach links verschoben und dadurch der Starter für Programme links kaum mehr erreichbar (dies ist immer noch so am 10.09.2023). Bei anderen Bildschirm-Auflösungen war alles gut. Nun kann man bei dem Monitor selbst eine automatische Anpassung durchführen und das Problem bei 1280x720 damit korrigieren. Bei mir ist es allerdings so, daß ein zweites Betriebssystem über einen KVM-Switch auch auf den gleichen Monitor zugreifen kann und wenn ich jetzt unter Debian eine Anpassung des Monitors vornehme dann ist der Bildschirm bei dem anderen Betriebssystem um ca. 4 cm nach rechts verschoben. |
Dieses Problem gab es bei
Debian 8 nicht, allerdings ist es in Debian
9 und 10 und 11, sowie Debian 12 (September 2023), auch vorhanden. Also ist dieses Problem schon einige Jahre alt und auch
unter wayland vorhanden. Als Anfänger war es für mich sehr schwer
überhaupt einen Zugang zu diesem Problem zu finden. Nach langem Suchen im
Internet habe ich eine Lösung für mich gefunden. Unter xorg funktioniert dies, aber
unter wayland nicht.
Hier in Kurzform meine Erläuterung. Zunächst habe ich gnome-system-log installiert (über synaptic). Dort habe ich mir syslog angeschaut und mir ist aufgefallen daß Informationen über Bildschirmauflösungen angezeigt werden. Z.B. Modeline "832x624"x0.0
57.28 832 864 928 1152 624 625 628 667 -hsync -vsync (49.7 kHz e) Modeline "800x600"x0.0 49.50 800 816 896 1056 600 601 604 625 +hsync +vsync (46.9 kHz e) . . . Es gibt mehrere Gruppen in denen man solche Informationen findet. Es gibt Gruppen in denen nach der Bildschirmauflösung x0.0 steht. Und solche in denen nach der Bildschirmauflösung xZahl steht (Zahl ist 75.0 oder 60.0 oder 59.8 ...) |
In der Gruppe mit 0.0 gibt es bei 1280x720 eine Ausnahme. Auch in dieser 0.0-Gruppe steht bei 1280x720 die x60.0 |
Die Modeline geben dem Monitor Anweisungen wie Bildpunkte auf dem Monitor gezeichnet werden - und jeder Monitor hat seine ganz persönliche Modeline. Falsche Modeline können den Monitor beschädigen. Deshalb sollte man sehr vorsichtig sein bei Änderungen der Modeline. Aber zuerst suchte ich die Modeline des verschobenen Bildschirms zu bestimmen. Dazu die Bildschirmauflösung 1280x720 einstellen und dann im Terminal eingeben |
xvidtune -show |
"1280x720" 74.25
1280 1390 1430 1650 720 725 730 750 +hsync +vsync Dies stimmt mit der rosa-modeline überein. Die mintfarbene modeline ist verlorengegangen. Also gibt es den Verdacht daß Debian mit der mintfarbenen modeline die richtige modeline festgestellt hat aber diese durch einen Programmierfehler nicht weitergereicht wurde. In der Tat ist es so daß bei Verwendung der mintfarbenen modeline der Monitor alles korrekt anzeigt. Nun ist die Änderung der modeline in Debian Buster eigentlich nicht vorgesehen - es soll alles automatisch geschehen. So funktionieren auch die meisten Anleitungen zum Ändern der modeline die im Internet zu finden sind bei Debian Buster überhaupt nicht. Für wayland hat man keine Möglichkeit - man muß warten bis irgendjemand den Programmierfehler findet. Aber unter xorg kann man das Programm xrandr verwenden. Dazu muß man den Namen des Monitors ermitteln |
xrandr | grep " connected" |
VGA-1 connected primary
1280x720+0+0 .... Am Anfang steht der Name des Monitors. Bei mir in diesem Fall VGA-1 Auf der folgenden Seite ist die Anwendung von xrandr sehr gut beschrieben http://www.knetfeder.de/linux/index.php?id=131 Und nach dieser Anleitung habe ich das Monitor-Problem bei mir gelöst. |
Es gibt bei Debian 10 einen Fehler beim Bearbeiten von txt-Dateien die in
früheren Versionen von Debian erzeugt wurden. Hier eine
Beispiel-Datei te.txt die in Debian 9 erzeugt wurde. Aufruf im
Terminal (Bild links) zeigt keine Besonderheit. Beim Einfügen zusätzlicher Zeichen am Ende
jeder Zeile mit sed gibt es Mängelexemplare bei der
Ersetzung (Bild mitte), allerdings
auch korrekte Ersetzungen. Dies ist auch unter wayland der Fall. Dieser
Fehler wird von einem Steuerzeichen Carriage Return erzeugt das man mit der Terminaleingabe sed 's|\r|\\r|g' sichtbar machen kann (Bild rechts). Beim Einfügen zusätzlicher Zeichen am Ende jeder Zeile mit sed kann man zunächst dieses Steuerzeichen entfernen und z.B. so vorgehen cat ~/te.txt | sed 's|\r|| ; s|$|, |g' Diese Lösung wurde mir von Assaf Gordon mitgeteilt (Vielen Dank). |
Der tieferliegende Grund für diesen Fehler liegt darin daß die
Textdateien nicht Linux-codiert gespeichert wurden. Bei gedit kann man mit
dem Menupunkt Speichern unter Einstellungen vornehmen und diese sollten so aussehen Bei windows-codierten txt-Dateien kann es zu Problemen kommen. Die Codierung einer Datei kann man im Terminal überprüfen mit file te.txt Eine Ausgabe der Form te.txt: ASCII text, with CRLF, LF line terminators oder auch te.txt: ASCII text, with CRLF line terminators macht die Datei im Terminal fehleranfällig. Die Ausgabe im Terminal sollte so aussehen: te.txt: ASCII text |
Es gibt einen Fehler bei dem Programm yad |
yad --title=FEHLER --form --align=center --field=:LBL --field="Zuordnung falsch":LBL --field="A1":FBTN "Befehl1" --field="A2":FBTN "Befehl2" --field="A3":FBTN "Befehl3" --field="A4":FBTN "Befehl4" --field=:LBL --field=:LBL --button="LOS" |
Das Drücken der Schaltfläche A1 löst den Befehl3 aus, der
der Schaltfläche A3 zugeordnet ist. Das Drücken der Schaltfläche A2 löst den Befehl4 aus, der der Schaltfläche A4 zugeordnet ist. Das Drücken der Schaltfläche A3 und A4 löst keinen Befehl aus. Die Ursache liegt in den beiden zuerst notierten :LBL Feldern, die ich als Formatierungsmöglichkeit verstanden habe. Diese verschieben die Zuordnung. Eine Lösungsmöglichkeit besteht darin daß man :LBL ersetzt durch :LBL "" Also folgendermaßen: |
yad --title=FUNKTIONIERT --form --align=center --field=:LBL "" --field="zusätzlich Anführungszeichen":LBL "" --field="A1":FBTN "Befehl1" --field="A2":FBTN "Befehl2" --field="A3":FBTN "Befehl3" --field="A4":FBTN "Befehl4" --field=:LBL "" --field=:LBL "" --button="LOS" |
|
Es gibt einen Fehler bei dem Programm yad Folgendes Fenster funktioniet |
yB=$(yad --title="Funktioniert" --columns="1" --form --align=center --field="Eingabe A":CE --field="Eingabe B":CE --button="Eingabe anzeigen" --button="BEENDEN":0 ) |
Das Drücken der Schaltfläche Eingabe anzeigen und anschließend: |
echo $yB |
aaAA|bbBB| Man bekommt also die Eingabe angezeigt. Vertauscht man jetzt die Reihenfolge der buttons |
yB=$(yad --title="FEHLER" --columns="1" --form --align=center --field="Eingabe A":CE --field="Eingabe B":CE --button="BEENDEN":0 --button="Eingabe anzeigen" ) |
so bleibt die Ausgabe echo $yB LEER. Man bekommt die Eingabe nicht mehr angezeigt. |
|
Es gibt einen "heimtückischen Fehler" in bash. Dazu betrachte man |
echo -en "4*1.1\n3*2.2\n2*4.1" |
4*1.1 3*2.2 2*4.1 Es gibt eine Ausgabe von 3 Zeilen. Aber eine Schleife die nur ausgibt was vorhanden ist |
echo -en "4*1.1\n3*2.2\n2*4.1" | while read Zeile; do echo "$Zeile"; done |
4*1.1 3*2.2 gibt nur 2 Zeilen aus. Überprüfen wieviele Zeilen vorhanden sind |
echo -en "4*1.1\n3*2.2\n2*4.1" | wc -l |
2 Es gibt also nur 2 Zeilen. Anfügen von Zeichen zu Beginn der Zeile |
echo -en "4*1.1\n3*2.2\n2*4.1" | sed 's/^/1+/' |
1+4*1.1 1+3*2.2 1+2*4.1 Es werden wieder 3 Zeilen ausgegeben. Aber while read und wc -l geben immer noch nur 2 Zeilen aus. Weitergabe an das Rechenprogramm |
echo -en "4*1.1\n3*2.2\n2*4.1" | bc |
4.4 6.6 (standard_in) 1: syntax error Es werden nur zwei Zeilen berechnet. Ausschneiden des ersten Feldes - es gibt ja nur ein Feld |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 |
4*1.1 3*2.2 2*4.1 Es werden 3 Zeilen ausgegeben. Die Schleife die nur ausgibt was vorhanden ist: |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 | while read Zeile; do echo "$Zeile"; done |
4*1.1 3*2.2 2*4.1 Jetzt werden 3 Zeilen ausgegeben. Zählen der Zeilen |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 | wc -l |
3 Also doch 3 Zeilen vorhanden. Nun alles in eine Zeile schreiben |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 | tr -d '\n' |
4*1.13*2.22*4.1 Die Schleife die nur ausgibt was vorhanden ist: |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 | tr -d '\n' | while read Zeile; do echo "$Zeile"; done |
Es wird nichts ausgegeben. Zählen wieviele Zeilen vorhanden sind |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 | tr -d '\n' | wc -l |
0 Es gibt KEINE Zeilen. Ausschneiden des ersten Feldes - es gibt ja nur ein Feld und anschließend an das Rechenprogramm weitergeben |
echo -en "4*1.1\n3*2.2\n2*4.1" | cut -f 1 | tr -d '\n' | cut -f 1 | bc |
41.12 Die Berechnung einer nichtvorhandenen Zeile ergibt 41.12 Es gibt einen unsichtbaren Feind der die Ausgabe sobotiert. Aber man kann diesen Feind sichtbar machen mit cat -A Damit werden unsichtbare Zeichen sichtbar. Zunächst ohne -n |
echo -e "4*1.1\n3*2.2\n2*4.1" | cat -A |
4*1.1$ 3*2.2$ 2*4.1$ Also viele unsichtbare Zeichen gibt es hierbei nicht! Man erkennt daß jede Zeile mit einem Zeilen-Ende-Zeichen $ abschließt (es ist ein abschließender Zeilenumbruch). Nun mit -n |
echo -en "4*1.1\n3*2.2\n2*4.1" | cat -A |
4*1.1$ 3*2.2$ 2*4.1 Man sieht daß in der letzten Zeile der abschließende Zeilenumbruch $ fehlt (das ist die Aufgabe von -n). Wenn aber dieses Zeilen-Ende-Zeichen $ nicht vorhanden ist gibt es für einige Terminal-Programme diese Zeile einfach nicht, zB. while read und wc. Andere Terminal-Programme erkennen diese Zeile und bearbeiten diese, z.B. sed und cut. Das Programm bc erkennt zumindest daß etwas nicht stimmt und gibt bei der 3.Zeile eine Fehlermeldung aus. Mit tr -d '\n' werden alle Zeilenumbrüche entfernt, also auch das Zeilen-Ende-Zeichen $ so daß diese Zeile für einige Terminal-Programme unsichtbar wird. Es können dadurch schwer zu erkennende Fehler entstehen, denn wer denkt schon daran daß ein abschließender Zeilenumbruch in der letzten Zeile verlorengehen kann. Es gibt die Möglichkeit den verlorengegangenen abschließenden Zeilenumbruch in der letzten Zeile wieder einzubauen. Z.B. mit pr -t Aber man muß wissen wann diese Problematik auftreten könnte! Hier noch der Nachweis daß es funktioniert |
echo -e "Zeile 1\nZeile 2\n\nZeile 3" | pr -t | cat -A |
Zeile 1$ Zeile 2$ $ Zeile 3$ und |
echo -en "Zeile 1\nZeile 2\n\nZeile 3" | pr -t | cat -A |
Zeile 1$ Zeile 2$ $ Zeile 3$ |