Cách sạch để tạm thời thay thế một tập tin cấu hình?


7

Tôi sử dụng một chương trình vẽ có tên Inkscape, có cả giao diện GUI và giao diện dòng lệnh. Khi được sử dụng trên dòng lệnh, nó có một số lượng lớn các tùy chọn chỉ có thể được kiểm soát thông qua tệp cấu hình dành riêng cho người dùng, được mã hóa cứng thành:

$HOME/.config/inkscape/preferences.xml

Tệp cấu hình này luôn chứa các tùy chọn được sử dụng gần đây nhất trong GUI, có thể là các tùy chọn sai khi tôi viết kịch bản.

Để giải quyết vấn đề này, tôi có tập lệnh của mình lưu một bản sao của tệp cấu hình, thay thế nó bằng một tệp cấu hình tiêu chuẩn, chạy chương trình và sau đó sao chép tệp cấu hình đã lưu lại.

Điều này hoạt động tốt nhưng không thực sự sạch sẽ. Ví dụ, nó sẽ không hoạt động đúng nếu hai phiên bản của tập lệnh đang được chạy đồng thời.

Trên Unix, có cách nào sạch hơn để thực hiện nhiệm vụ này trong việc giả mạo một chương trình để nó lấy tệp cấu hình của nó từ nơi nào đó mà tôi muốn, thay vì từ tên đường dẫn được mã hóa cứng trong chương trình không? Có lẽ một cái gì đó liên quan đến các liên kết, hoặc một cái gì đó như nhà tù BSD?

Câu trả lời:


9

Inkscape có một tính năng cho điều này là 0,47 :

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

Đặt preferences.xmltập tin tùy chỉnh tập lệnh của bạn vào /some/other/path. Nó phải là một thư mục chuyên dụng, bởi vì Inkscape sẽ điền vào nó với tất cả các tệp khác mà nó thường đặt ~/.config/Inkscapekhi bạn chạy nó như thế này.


Vì vậy, bạn có thể chạy nhiều phiên bản đơn giản bằng cách đưa ra một biến khác nhau trước khi chạy, phải không? BTW tốt!
slm

1
@slm: Vâng. Ở đây, biến môi trường đang được sử dụng giống như một tùy chọn dòng lệnh, vì nó chỉ ảnh hưởng đến một thể hiện duy nhất đang được chạy. Và tôi đã tìm thấy nó bằng cách đọc nguồn. :)
Warren Young


@BenCrowell - cảm ơn, tôi đã để lại một bình luận đề cập rằng sự tồn tại của env ẩn đó. biến trong các tài liệu chính thức sẽ giúp bạn và chúng tôi tiết kiệm được rất nhiều thời gian.
slm

7

Vì Inkscape là phần mềm FOSS , chúng tôi chỉ có thể thêm một tùy chọn vào chương trình cho phép bạn chuyển tên của tệp cấu hình khác, như vậy:

=== tệp đã sửa đổi '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);
         }

+ // Đồng thời chấp nhận ghi đè qua dòng lệnh
+ gchar bên ngoài * sp_preferences;
+ if (sp_preferences) {
+ prefdir = sp_preferences;
+}
+
 #ifdef HAS_SHGet SpecialFolderLocation
         // thích c: \ Documents and Settings \ UserName \ Application Data \ to
         // c: \ Tài liệu và Cài đặt \ userName \;

=== tệp đã sửa đổi '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_PREENCENCES,
     SP_ARG_LAST
 };

@@ -228,6 +229,7 @@
 gboolean sp_query_all = FALSE tĩnh;
 gchar tĩnh * sp_query_id = NULL;
 gboolean sp_shell tĩnh = FALSE;
+ gchar * sp_preferences = NULL;
 gboolean sp_vacuum_defs tĩnh = FALSE;
 #ifdef VỚI_DBUS
 gboolean sp_dbus_listen = FALSE;
@@ -520,6 +522,11 @@
      N _ ("Bắt đầu Inkscape ở chế độ vỏ tương tác."),
      VÔ GIÁ TRỊ},

+ {"ưu tiên", 0,
+ POPT_ARG_STRING, & sp_preferences, SP_ARG_PREFERENCES,
+ N _ ("Chỉ định một tệp ưu tiên khác."),
+ NULL},
+
     POPT_AUTOHELP POPT_TABLEEND
 };

Tôi không mong đợi các nhà phát triển Inkscape chấp nhận bản vá này, vì hai lý do. Đầu tiên, họ đã có một tính năng thay thế với hiệu ứng tương tự. Nhưng thứ hai, tôi sẽ không mong đợi họ thích cách tôi tạo sp_preferenceschương trình toàn cầu thay vì mô-đun toàn cầu. Tuy nhiên, loại mã này phù hợp với tính năng cá nhân mà bạn không có ý định là một phần của phần mềm chính.

Bản vá ở trên có thể trông khá xấu đối với người không lập trình hoặc người không quen với C ++ và các tệp vá , nhưng tin tôi đi, điều này đơn giản như những thay đổi đối với phần mềm. Đó chỉ là 10 dòng mã mới.

(Nếu bạn tự đếm và đưa ra 13 dòng mới, ba trong số đó là trống hoặc chỉ có một dấu ngoặc nhọn, vì vậy bạn không bao gồm những dòng trong số SLOC .)


Sử dụng tệp cấu hình thay thế phải là một tùy chọn dòng lệnh, nhưng inkscape dường như không có điều này. Lạ thật.
Faheem Mitha

@FaheemMitha: Sự lựa chọn của các nhà phát triển Inkskape để thực hiện điều này như một biến môi trường thực sự là điều tương tự. Điều đó không sai, chỉ là một sự lựa chọn phong cách khác nhau. Tuy nhiên, nếu bạn thích tùy chọn dòng lệnh cho biến môi trường, bạn đã có bản vá của tôi ngay bây giờ, bạn có thể sử dụng nguyên trạng hoặc xây dựng theo.
Warren Young

Tôi nghĩ cả hai lựa chọn đều có thể và có thể cùng tồn tại.
Faheem Mitha

1

Bạn có thể sử dụng các liên kết tượng trưng. Đặt tệp cấu hình bạn sử dụng với GUI của bạn ở một nơi nào đó, hãy gọi nó là GUI_CONFIG và tệp có tập lệnh thành SCRIPT_CONFIG. Ở đầu tập lệnh của bạn đặt dòng:

ln -sf SCRIPT_CONFIG $HOME/.config/inkscape/preferences.xml

Và cuối cùng:

ln -sf GUI_CONFIG $HOME/.config/inkscape/preferences.xml

Khi tập lệnh thực thi, nó sẽ tạo preferences.xmlmột liên kết tượng trưng trỏ đến cấu hình mà nó cần. Khi nó kết thúc, nó trỏ nó trở lại cái mà GUI sử dụng. Chạy nhiều tập lệnh đồng thời sẽ không phá hủy cấu hình của bạn, giống như khi sao chép tệp tạm thời, mặc dù tập lệnh đầu tiên hoàn thành sẽ phá vỡ tệp cấu hình để vẫn chạy tập lệnh. Có lẽ tốt nhất là đặt các cuộc gọi lnxung quanh các cuộc gọi riêng lẻ đến Inkscape, thay vì toàn bộ các tập lệnh, để cố gắng ngăn chặn các điều kiện cuộc đua này.

Một tùy chọn khác là chạy Inkscape như một người dùng khác với các tập lệnh, vì vậy bạn có thể thiết lập nó với một tệp cấu hình khác. Tuy nhiên, sau đó bạn sẽ phải xử lý các quyền, có thể bằng cách sao chép các tệp qua lại /tmp.


1
Điều này hiếm khi tốt hơn so với sao chép tệp và không thực sự giải quyết được vấn đề, đó là đường dẫn được mã hóa cứng hiện tại trong Inkscape cho phép nhiều chương trình can thiệp lẫn nhau.
Warren Young

1
Nếu bạn không muốn chỉnh sửa lntùy chọn ngoài câu trả lời của mình, ít nhất bạn nên đăng tùy chọn "người dùng khác" dưới dạng câu trả lời riêng. Tôi có thể tự mình nâng cao điều đó, nhưng không phải khi gắn với lncâu trả lời.
Warren Young

1
Các cuộc gọi lnlà không cần thiết, vì vậy anh ta không phải lo lắng về việc phá hủy các tệp cấu hình của mình hoặc để nó ở trạng thái không mong muốn sau khi tất cả các quy trình đã kết thúc. Nó thu hẹp cửa sổ cho các điều kiện cuộc đua, và làm cho chúng ít nghiêm trọng hơn.
wingbedubmariner

1

Nhìn qua tài liệu cho hệ thống con tùy chọn trong Inkscape, nó không có khả năng.

Lựa chọn của bạn:

  1. làm những gì bạn đang làm
  2. chơi trò chơi thông qua liên kết tập tin
  3. người dùng ID người dùng khác
  4. sửa đổi nguồn (xem câu trả lời của @ WarrenYoung cho việc này!)

Tôi không thấy cách bạn đi đến kết luận đầu tiên của bạn. Trang đó cho tôi biết chương trình đã có cách vượt qua một con đường khác trên Windows vs Linux. Tất cả bạn phải làm là cung cấp một nguồn dữ liệu thứ ba cho đường dẫn, lấy nó từ dòng lệnh. Nếu OP không phải là lập trình viên C, hãy tìm một. Chúng rất phong phú. :)
Warren Young

@WarrenYoung - hiện tại nó không phải là một khả năng vì nó đứng trên Linux, ít nhất là theo các tài liệu. Tôi không có ý ám chỉ chức năng không bị chôn vùi trong Inkscape và việc sửa đổi nguồn sẽ không dễ dàng hoặc có thể, chỉ là hiện tại không có công tắc nào.
slm

@WarrenYoung - Bạn có tình nguyện sửa mod này cho anh ấy không?
slm

Điều này thậm chí sẽ là một cuộc thảo luận nếu đây là một tập tin cấu hình /etcthay vì một chương trình C? Sự khác biệt cần thiết là gì? Có phải thực tế là một chỉnh sửa khó thực hiện hơn? Nếu vậy, tại sao điều đó ảnh hưởng đến việc câu trả lời của tôi là một câu trả lời?
Warren Young

1
@WarrenYoung câu trả lời của bạn chắc chắn là một câu trả lời hợp lệ, nhưng vì vậy sẽ trả lời rằng OP nên viết một mô-đun hạt nhân để cho phép gắn kết gắn kết trên cơ sở mỗi quá trình để anh ta có thể lừa Inkspace đọc tệp cấu hình của nó từ một thư mục khác. Tất nhiên, nếu bạn mã hóa tính năng này vào Inkscape cho anh ta, bạn đã vượt xa cuộc gọi cho nhiệm vụ :)
wingbedubmariner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.