zur Übersicht nächste Seite

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$



zur Übersicht nächste Seite

Datenschutzerklärung
Impressum