临时替换配置文件的干净方法?

Ben*_*ell 7 scripting configuration files namespace inkscape

我使用一个名为 Inkscape 的绘图程序,它具有 GUI 和命令行界面。在命令行上使用时,它有大量选项只能通过用户特定的配置文件进行控制,该文件被硬编码为:

$HOME/.config/inkscape/preferences.xml
Run Code Online (Sandbox Code Playgroud)

这个配置文件总是包含最近在 GUI 中使用的选项,这在我编写脚本时可能是错误的。

为了解决这个问题,我让我的脚本保存了一份配置文件的副本,用标准配置文件替换它,运行程序,然后将保存的配置文件复制回来。

这工作正常,但不是很干净。例如,如果脚本的两个实例同时运行,它将无法正常工作。

在 Unix 上,是否有一种更简洁的方法来执行伪造程序的任务,以便它从我想要的某个地方获取其配置文件,而不是从程序中硬编码的路径名?也许涉及链接的东西,或者像BSD监狱之类的东西?

War*_*ung 9

从 0.47 开始, Inkscape 有一个功能:

$ INKSCAPE_PORTABLE_PROFILE_DIR=/some/other/path inkscape --args
Run Code Online (Sandbox Code Playgroud)

将脚本的自定义preferences.xml文件放在/some/other/path. 它应该是一个专用目录,因为~/.config/Inkscape当您像这样运行它时,Inkscape 会用它通常放入的所有其他文件填充它。


War*_*ung 7

因为 Inkscape 是FOSS软件,我们可以在程序中添加一个选项,让您传递另一个配置文件的名称,如下所示:

=== 修改文件 'src/inkscape.cpp'
--- src/inkscape.cpp 2013-09-28 19:20:27 +0000
+++ src/inkscape.cpp 2013-11-02 04:07:45 +0000
@@ -1443,6 +1443,12 @@
             prefdir = g_strdup(val);
         }

+ // 也可以通过命令行接受覆盖
+ extern gchar* sp_preferences;
+ 如果(sp_preferences){
+ prefdir = sp_preferences;
+ }
+
 #ifdef HAS_SHGetSpecialFolderLocation
         // 更喜欢 c:\Documents and Settings\UserName\Application Data\
         // c:\Documents and Settings\userName\;

=== 修改文件 'src/main.cpp'
--- src/main.cpp 2013-09-24 18:31:44 +0000
+++ src/main.cpp 2013-11-02 04:05:30 +0000
@@ -179,6 +179,7 @@
     SP_ARG_VERB_LIST,
     SP_ARG_VERB,
     SP_ARG_SELECT,
+ SP_ARG_PREFERENCES,
     SP_ARG_LAST
 };

@@ -228,6 +229,7 @@
 静态 gboolean sp_query_all = FALSE;
 静态 gchar *sp_query_id = NULL;
 静态 gboolean sp_shell = FALSE;
+gchar *sp_preferences = NULL;
 静态 gboolean sp_vacuum_defs = FALSE;
 #ifdef WITH_DBUS
 静态 gboolean sp_dbus_listen = FALSE;
@@ -520,6 +522,11 @@
      N_("在交互式 shell 模式下启动 Inkscape。"),
      空值},

+ {"偏好", 0,
+ POPT_ARG_STRING、&sp_preferences、SP_ARG_PREFERENCES、
+ N_("指定不同的首选项.xml 文件。"),
+ NULL},
+
     POPT_AUTOHELP POPT_TABLEEND
 };

我不希望 Inkscape 开发人员接受这个补丁,原因有二。首先,他们已经有了具有相同效果的替代功能。但其次,我不希望他们喜欢我将sp_preferences程序全局化而不是模块全局化的方式。然而,这种代码适用于您不打算成为主线软件一部分的个人功能。

上面的补丁对于非程序员或不熟悉 C++ 和补丁文件的人来说可能看起来相当丑陋,但相信我,这就像对软件的更改一样简单。它只有 10 行新代码。

(如果您自己计算并提出 13 行新行,其中 3 行是空白的或只有一个花括号,因此您不将这些包括在SLOC计数中。)