구성 파일을 임시로 교체하는 깔끔한 방법은 무엇입니까?

구성 파일을 임시로 교체하는 깔끔한 방법은 무엇입니까?

저는 GUI와 명령줄 인터페이스를 모두 갖춘 Inkscape라는 그리기 프로그램을 사용합니다. 명령줄에서 사용할 경우 다음과 같이 하드 코딩된 사용자별 구성 파일을 통해서만 제어할 수 있는 많은 옵션이 있습니다.

$HOME/.config/inkscape/preferences.xml

구성 파일에는 항상 GUI에서 가장 최근에 사용한 옵션이 포함되어 있는데, 이는 스크립트를 작성할 때 잘못되었을 수 있습니다.

이 문제를 해결하기 위해 스크립트에서 구성 파일의 복사본을 저장하고 이를 표준 구성 파일로 바꾸고 프로그램을 실행한 다음 저장된 구성 파일을 다시 복사하도록 했습니다.

이것은 잘 작동하지만 그다지 깨끗하지는 않습니다. 예를 들어, 두 개의 스크립트 인스턴스를 동시에 실행하면 제대로 작동하지 않습니다.

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 개발자들이 두 가지 이유로 이 패치를 받아들일 것이라고 기대하지 않습니다. 첫째, 그들은대체 기능이미 동일한 효과가 있습니다. 하지만 둘째, 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의 답변이것을 위해! )

관련 정보