Was bedeutet diese Wenn-Dann-Aussage?

7

Ich habe in meinem System herumgespielt und bin darauf gestoßen

~$ echo $XDG_DATA_DIRS
/usr/share/ubuntustudio:/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share

Als ich mich fragte, warum ich /usr/sharezweimal auf dem Weg bin, fand ich heraus, dass das folgende Snippet, in /etc/alternatinves/x-session-managerdem ein Link zu /usr/bin/startxfce4steht, dafür verantwortlich ist:

#!/bin/sh
.
.
.
if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="/usr/share:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:/usr/share"
fi
export XDG_DATA_DIRS
.
.
.

Wenn ich auf die Linie schaue

if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then

Ich habe Schwierigkeiten, diese if-Aussage zu verstehen. Für mich sieht es aus wie ein Vergleich von Zeichenfolgen, bei denen die erste immer falsch und die zweite immer wahr ist.

In Kombination mit einer Logik wird order Test immer als wahr ausgewertet , sodass ich die Zeile auf kürzen if true; thenoder sagen kann, dass ich überhaupt keine if-Anweisung benötige.

Wo ist mein Fehler? Oder ist es so geschrieben, um Anfänger wie mich zu verwirren?

mook765
quelle
3
Das Git-Repo ist unter git.xfce.org/xfce/xfce4-session verfügbar . Wenn Sie die Software verbessern, teilen Sie es bitte der Welt mit! :)
Dessert
@ Dessert fertig ...
mook765

Antworten:

2

Sie haben Recht, der Befehl

test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"

gibt immer true (0) zurück.

Es sieht so aus, als ob die betreffende Datei aus einer allgemeineren Version generiert wurde, aber die Art der Generierung war nicht optimal. Das Skript sollte entweder jedes Mal nach tatsächlichen Pfaden fragen oder nur den relevanten Zweig in der generierten Datei behalten.

Diese bestimmte Datei stammt jedoch aus einem Paket, das nicht auf Ihrem Computer generiert wird. Dies wird wahrscheinlich behoben / verbessert ... Sie können einen Fehler in Xfce Bugzilla einreichen (falls er dort noch nicht vorhanden ist) oder ihn selbst beheben. Sie können das Git-Repository für die Xfce4-Sitzung klonen und über ihre Mailingliste mit Xfce4-Entwicklern in Kontakt treten . Viel Glück bei der Verbesserung des Codes!

Melebius
quelle
1

Das Skript /usr/bin/startxfce4scheint von einem Parser generiert zu werden. Wir können sehen, dass wir uns beim Betrachten des Quellcodes das entsprechende Snippet ansehen:

if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x@_datadir_@" = "x/usr/local/share" -o "x@_datadir_@" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="@_datadir_@:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:@_datadir_@"
fi
export XDG_DATA_DIRS

Hier können wir die Bedeutung dieses if-Blocks sehen. Die Entwickler geben Paket-Maitainern die Möglichkeit, einen benutzerdefinierten Pfad hinzuzufügen, XDG_DATA_DIRSindem sie den gewünschten Pfad zum Skript analysieren und die Zeichenfolge @_datadir_@durch diesen Pfad ersetzen .

Dies funktioniert einwandfrei, wenn ein Pfad analysiert wird, XDG_DATA_DIRSder zum Zeitpunkt der Skriptausführung nicht enthalten ist. Der Pfad wird jedoch zweimal angezeigt, wenn ein Pfad analysiert wird, der zum Zeitpunkt der Skriptausführung XDG_DATA_DIRSbereits vorhanden ist XDG_DATA_DIRS.

Dies könnte vermieden werden, indem die Standard-XDG-Ordner ( /usr/share, /usr/local/share) nicht im Skript analysiert werden. Ich weiß jedoch nicht, ob dies möglich ist.

Eine andere Lösung besteht darin, den Quellcode in zu ändern

if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x@_datadir_@" = "x/usr/local/share" -o "x@_datadir_@" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="@_datadir_@:/usr/local/share:/usr/share"
  fi
else
  if test "x@_datadir_@" != "x/usr/local/share" -a "x@_datadir_@" != "x/usr/share"; then
    XDG_DATA_DIRS="$XDG_DATA_DIRS:@_datadir_@"
  fi
fi
export XDG_DATA_DIRS

Das würde nur die Verzeichnisse abdecken /usr/shareund /usr/local/shareobwohl und man sollte in der Tat prüfen, ob es @_datadir_@bereits existiert XDG_DATA_DIRSoder nicht, aber ich weiß nicht, wer das tun soll, mein Wissen endet hier.

In Ergänzung:

Gleiches gilt für diesen Teil des Skripts:

if test "x$XDG_CONFIG_DIRS" = "x"
then
  if test "x@_sysconfdir_@" = "x/etc"; then
    XDG_CONFIG_DIRS="/etc/xdg"
  else
    XDG_CONFIG_DIRS="/etc/xdg:@_sysconfdir_@/xdg"
  fi
else
  XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:@_sysconfdir_@/xdg"
fi
export XDG_CONFIG_DIRS

Wenn wir es analysieren /etc/xdg/ ersetzen, wird @_sysconfdir_@es zu einem doppelten Pfad ( /etc/xdg:/etc/xdgin XDG_CONFIG_DIRS.

Schöne Grüße

Ich bin ein Endbenutzer, weit davon entfernt, Entwickler zu sein, daher kann ich das Problem nicht vollständig lösen. Dank Dessert und Melebius , die mich in die richtige Richtung getrieben haben, verstehe ich diese Wenn-Dann-Aussage jetzt zumindest.

Ich glaube, dass es nicht schadet, in diesen Umgebungsvariablen zweimal einen Pfad zu haben, daher werde ich keinen Fehler melden. Lassen Sie die Entwickler wertvollere Dinge tun.

Meine persönliche Lösung

Ich habe die Zeilen 67-89 in geändert /usr/bin/startxfce4

if test "x$XDG_DATA_DIRS" = "x"
then
  if test "x/usr/share" = "x/usr/local/share" -o "x/usr/share" = "x/usr/share"; then
    XDG_DATA_DIRS="/usr/local/share:/usr/share"
  else
    XDG_DATA_DIRS="/usr/share:/usr/local/share:/usr/share"
  fi
else
  XDG_DATA_DIRS="$XDG_DATA_DIRS:/usr/share"
fi
export XDG_DATA_DIRS

if test "x$XDG_CONFIG_DIRS" = "x"
then
  if test "x/etc" = "x/etc"; then
    XDG_CONFIG_DIRS="/etc/xdg"
      else
   XDG_CONFIG_DIRS="/etc/xdg:/etc/xdg"
  fi
else
  XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:/etc/xdg"
fi
export XDG_CONFIG_DIRS

zu

if test "x$XDG_DATA_DIRS" = "x"
then
  XDG_DATA_DIRS="/usr/local/share:/usr/share"
fi
export XDG_DATA_DIRS

if test "x$XDG_CONFIG_DIRS" = "x"
then
  XDG_CONFIG_DIRS="/etc/xdg"
fi
export XDG_CONFIG_DIRS

Natürlich habe ich zuerst die Originaldatei gesichert.

mook765
quelle