我使用一个名为 Inkscape 的绘图程序,它既有 GUI 又有命令行界面。当在命令行上使用时,它有大量选项,只能通过特定于用户的配置文件进行控制,该配置文件被硬编码为:
$HOME/.config/inkscape/preferences.xml
该配置文件始终包含 GUI 中最近使用的选项,当我编写脚本时这些选项可能是错误的。
为了解决这个问题,我让脚本保存配置文件的副本,将其替换为标准配置文件,运行程序,然后将保存的配置文件复制回来。
这工作正常,但不是很干净。例如,如果同时运行脚本的两个实例,它将无法正常工作。
在 Unix 上,是否有一种更干净的方法来执行伪造程序的任务,以便它从我想要的某个地方获取其配置文件,而不是从程序中硬编码的路径名?也许是涉及链接的东西,或者是 BSD 监狱之类的东西?
答案1
Inkscape 有一个功能可以解决这个问题截至 0.47:
$ INKSCAPE_PORTABLE_PROFILE_DIR=/some/other/path inkscape --args
将脚本的自定义preferences.xml
文件放入/some/other/path
.它应该是一个专用目录,因为~/.config/Inkscape
当您像这样运行它时,Inkscape 会用它通常放入的所有其他文件填充它。
答案2
因为 Inkscape 是自由软件软件中,我们可以向程序添加一个选项,让您传递另一个配置文件的名称,如下所示:
===修改文件'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; + if (sp_preferences) { + prefdir = sp_首选项; + } + #ifdef HAS_SHGetSpecialFolderLocation // 更喜欢 c:\Documents and Settings\UserName\Application Data\ // c:\Documents and Settings\用户名\; ===修改文件'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_首选项, 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; #ifdefWITH_DBUS 静态gboolean sp_dbus_listen = FALSE; @@ -520,6 +522,11 @@ N_("以交互 shell 模式启动 Inkscape。"), 无效的}, + {“偏好”,0, + POPT_ARG_STRING、&sp_首选项、SP_ARG_PREFERENCES、 + N_("指定不同的preferences.xml 文件。"), + 空}, + POPT_AUTOHELP POPT_TABLEEND };
我不希望 Inkscape 开发人员接受这个补丁,原因有两个。首先,他们有替代功能已经有同样的效果了。但其次,我不希望他们喜欢我使sp_preferences
程序全局而不是模块全局的方式。然而,这种代码对于您不打算成为主线软件一部分的个人功能来说是很好的。
对于非程序员或不熟悉 C++ 的人来说,上面的补丁可能看起来相当难看补丁文件,但是相信我,这就像更改软件一样简单。只有 10 行新代码。
(如果您自己计算并得出 13 个新行,其中三行是空白或只有大括号,因此您不会将它们包含在SLOC数数。)
答案3
您可以使用符号链接。将用于 GUI 的配置文件放在某处,我们将其称为 GUI_CONFIG,将带有脚本的文件称为 SCRIPT_CONFIG。在脚本的开头放置以下行:
ln -sf SCRIPT_CONFIG $HOME/.config/inkscape/preferences.xml
最后:
ln -sf GUI_CONFIG $HOME/.config/inkscape/preferences.xml
当脚本执行时,它将创建preferences.xml
一个指向其所需配置的符号链接。当它完成时,它会将其指向 GUI 使用的那个。同时运行多个脚本不会破坏您的配置,就像复制临时文件时一样,尽管第一个脚本完成将破坏仍在运行的脚本的配置文件。最好将调用放在ln
Inkscape 的各个调用周围,而不是整个脚本,以尝试防止这些竞争条件。
另一种选择是以与脚本不同的用户身份运行 Inkscape,这样您就可以使用不同的配置文件进行设置。但是,您随后必须处理权限,可能通过将文件来回复制到/tmp
.