設定ファイルを一時的に置き換えるきちんとした方法は何ですか?

設定ファイルを一時的に置き換えるきちんとした方法は何ですか?

私はGUIとコマンドラインインターフェイスの両方を持つInkscapeという描画プログラムを使用しています。コマンドラインで使用する場合は、ハードコーディングされたユーザー固有の構成ファイルを使用してのみ制御できる多くのオプションがあります。

$HOME/.config/inkscape/preferences.xml

構成ファイルには、常にGUIで最後に使用したオプションが含まれていますが、スクリプトの作成時に間違っている可能性があります。

この問題を解決するために、スクリプトは構成ファイルのコピーを保存し、それを標準の構成ファイルに置き換えてプログラムを実行し、保存した構成ファイルを再コピーします。

これはうまくいきますが、それほどきれいではありません。たとえば、2つのスクリプトインスタンスを同時に実行すると、正しく機能しません。

Unixでは、プログラムにハードコードされたパス名ではなく、私が望む場所から設定ファイルを取得するようにプログラムを偽造することを行うよりきちんとした方法がありますか?リンクに関連するものやBSD刑務所のようなものがありますか?

答え1

Inkscapeにはこの問題を解決する機能があります0.47から:

$ INKSCAPE_PORTABLE_PROFILE_DIR=/some/other/path inkscape --args

スクリプトのカスタムpreferences.xmlファイルをここに入れます。これを実行すると、Inkscapeは通常保存する他のすべてのファイルでいっぱいになる/some/other/pathため、専用ディレクトリにする必要があります。~/.config/Inkscape

答え2

なぜなら、インクスケープはフリーソフトウェアソフトウェアでは、次のように他のプロファイルの名前を渡すオプションをプログラムに追加できます。

==='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);
         }

+ //コマンドラインを介して上書きを許可することもできます。
+外部gchar * sp_preferences;
+if(sp_preferences){
+ prefdir = sp_preferences;
+}
+
 #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_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;
 #ifdefWITH_DBUS
 静的gboolean sp_dbus_listen = FALSE;
@@-520,6 +522,11 @@
      N_("対話型シェルモードで Inkscape を起動します。"),
      無効}、

+{「好み」、0、
+ POPT_ARG_STRING、&sp_PREFERENCES、SP_ARG_PREFERENCES、
+ N_("他の preferences.xml ファイルを指定してください。"),
+空白},
+
     POPT_AUTOHELP POPT_TABLEEND
 };

私はInkscape開発者が2つの理由でこのパッチを受け入れるとは思わない。まず、彼ら代替機能すでに同じ効果があります。しかし、第二に、sp_preferencesモジュール全体ではなくプログラム全体で作った方法を彼らが好きではないことを願っています。ただし、この種のコードは、メインラインソフトウェアの一部にならない個々の機能に適しています。

プログラマーでない人やC ++に慣れていない人にとっては、上記のパッチが多少見苦しく見えるかもしれません。パッチファイルしかし、私を信じてください。ソフトウェアを変更するのと同じくらい簡単です。新しいコードはわずか10行です。

(数学を直接実行して13の新しい行がある場合は、そのうち3つは空白または中括弧のみであるため、その行を含めないでください。スロック計算。 )

答え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

答え4

Inkscapeの基本設定サブシステムに関するドキュメントを見ると、これは不可能です。

あなたの選択:

  1. 今やっていることをやってください
  2. リンクされたファイルを介してゲームをプレイ
  3. 別のユーザーIDを使用する
  4. ソースを変更します(参照:@WarrenYoungの返信これのために! )

関連情報