Ich verwende ein Zeichenprogramm namens Inkscape, das sowohl eine GUI als auch eine Befehlszeilenschnittstelle hat. Bei Verwendung in der Befehlszeile stehen zahlreiche Optionen zur Verfügung, die nur über eine benutzerspezifische Konfigurationsdatei gesteuert werden können, die fest codiert ist:
$HOME/.config/inkscape/preferences.xml
Diese Konfigurationsdatei enthält immer die Optionen, die zuletzt in der GUI verwendet wurden. Diese können beim Erstellen von Skripten falsch sein.
Um dies zu umgehen, muss mein Skript eine Kopie der Konfigurationsdatei speichern, durch eine Standardkonfigurationsdatei ersetzen, das Programm ausführen und dann die gespeicherte Konfigurationsdatei zurückkopieren.
Dies funktioniert in Ordnung, ist aber nicht wirklich sauber. Beispielsweise funktioniert es nicht ordnungsgemäß, wenn zwei Instanzen des Skripts gleichzeitig ausgeführt werden.
Gibt es unter Unix eine sauberere Möglichkeit, diese Aufgabe des Fälschens eines Programms auszuführen, sodass die Konfigurationsdatei von einem gewünschten Ort stammt und nicht von dem im Programm fest codierten Pfadnamen? Vielleicht etwas mit Links oder so etwas wie BSD-Gefängnisse?
Da es sich bei Inkscape um eine FOSS- Software handelt, können wir dem Programm einfach eine Option hinzufügen, mit der Sie den Namen einer anderen Konfigurationsdatei wie folgt übergeben können:
Ich würde aus zwei Gründen nicht erwarten, dass die Inkscape-Entwickler diesen Patch akzeptieren. Erstens haben sie bereits eine alternative Funktion mit dem gleichen Effekt. Aber zweitens würde ich nicht erwarten, dass ihnen die Art und Weise gefällt, wie ich
sp_preferences
programmglobal statt modulglobal gemacht habe. Diese Art von Code eignet sich für eine persönliche Funktion, die Sie jedoch nicht als Teil der Hauptsoftware verwenden möchten.Der obige Patch mag für einen Nicht-Programmierer oder einen, der nicht mit C ++ und Patch-Dateien vertraut ist, ziemlich hässlich aussehen , aber glauben Sie mir, dies ist ungefähr so einfach wie Änderungen an der Software. Es sind nur 10 Zeilen neuen Codes.
(Wenn Sie selbst zählen und 13 neue Zeilen erstellen, sind drei davon leer oder haben nur eine geschweifte Klammer, sodass Sie diese nicht in die SLOC- Zählung einbeziehen .)
quelle
Sie könnten symbolische Links verwenden. Legen Sie die Konfigurationsdatei, die Sie mit Ihrer GUI verwenden, irgendwo ab, nennen Sie sie GUI_CONFIG und die mit Skripten für SCRIPT_CONFIG. Setzen Sie am Anfang Ihres Skripts die Zeile:
und am Ende:
Wenn das Skript ausgeführt wird, wird
preferences.xml
ein symbolischer Link erstellt, der auf die benötigte Konfiguration verweist. Wenn es fertig ist, zeigt es auf das zurück, das die GUI verwendet. Wenn Sie mehrere Skripte gleichzeitig ausführen, wird Ihre Konfiguration nicht zerstört, wie dies beim Kopieren von temporären Dateien der Fall ist. Wenn Sie jedoch das erste Skript ausführen, wird die Konfigurationsdatei für noch laufende Skripts beschädigt. Es ist vielleicht am besten, die Anrufe aufln
die einzelnen Anrufe in Inkscape anstatt auf die Skripte als Ganzes zu verteilen, um zu versuchen, diese Rennbedingungen zu verhindern.Eine andere Möglichkeit wäre, Inkscape als einen anderen Benutzer als Skripte auszuführen, damit Sie es mit einer anderen Konfigurationsdatei einrichten können. Sie müssen sich dann jedoch mit Berechtigungen befassen, möglicherweise indem Sie Dateien hin und her kopieren
/tmp
.quelle
ln
Option nicht aus Ihrer Antwort heraus bearbeiten möchten , sollten Sie zumindest die Option "anderer Benutzer" als separate Antwort veröffentlichen. Ich könnte das alleine bewerten, aber nicht, wenn ich an dieln
Antwort gebunden bin .ln
sind idempotent, sodass er sich keine Sorgen machen muss, seine Konfigurationsdateien zu zerstören oder sie nach Abschluss aller Prozesse in einem unerwünschten Zustand zu belassen. Es verengt das Fenster für Rennbedingungen und macht sie weniger streng.Wenn Sie in der Dokumentation nach dem Einstellungssubsystem in Inkscape suchen, ist dies nicht möglich.
Deine Optionen:
quelle
/etc
anstelle eines C-Programms wäre? Was ist der wesentliche Unterschied? Ist es nur die Tatsache, dass eine Bearbeitung schwieriger ist? Wenn ja, warum wirkt sich das darauf aus, ob meine Antwort eine Antwort ist?