2010-02-04 21 views
1

我正在寫一個'C'程序,使幾個調用system()來執行其他程序。在構造命令字符串時,最好是明確地給出被調用程序的完整路徑,還是隻給出可執行文件名並讓shell使用PATH環境變量來解析它的位置?依靠PATH或提供一個明確的路徑,當使用系統()

我正在調用的程序都是單個程序包的一部分,我從預處理程序定義中找到安裝目錄的路徑。給出顯式路徑似乎可以避免在多個安裝的程序共享相同名稱時可能發生的錯誤。但是,它使得構建命令字符串變得更復雜一些,如果用戶在安裝後移動程序,所有內容都會中斷。

是否有被廣泛接受的最佳實踐?

[澄清]

我使用的autoconf/Automake生成的distribuion。提供安裝目錄的預處理器定義由makefile創建。它反映了用戶在configure comamnd行或make命令行中指定的安裝目錄的選擇。儘管我使用環境變量來指定二進制文件的位置,但我認爲這一點很重要。這似乎是讓用戶重建只是爲了改變二進制文件的位置而產生的一種不必要的痛苦。

+0

您的安裝目錄位於我的機器的錯誤位置...所以請確保用戶可以將軟件安裝在他們想要的位置,而不是您想要的位置(儘管您當然可以擁有首選位置或默認位置)。然後允許在處理中進行選擇。你可以合理地假設你自己的軟件都在同一個地方。您不能假定可選軟件在您期望的位置(儘管嘗試/ bin和/ usr/bin可能是合理的)。在我的機器上,/ usr/local是由MIS以只讀方式安裝的,並且帶有古老軟件(Perl 4去年消失!)。我使用/ usr/gnu。 – 2010-02-05 01:06:00

回答

1

最好的做法是不要假設你要安裝的系統。如果你只是讓用戶選擇,你可以擁有兩全其美。

PATH_TO_TOOL1=foo 
PATH_TO_TOOL2=/usr/bin/bar 

你可以,當然,只是回落到某種形式的違約或如果沒有定義的變量的偏好:請您撥打一個應用程序的喜好或需要路徑的指令也可以在環境中定義沒有設置。編寫你的應用程序更靈活永遠是最好的選擇!

+0

非常感謝。其他人重複了你的建議,我感謝他們,但我認爲你是第一位的,最明確的。 – 2010-02-05 00:54:48

+0

全部14秒... – 2010-02-05 01:01:03

3

最佳做法是不要假定您在構建時知道您的安裝目錄。讓用戶決定在哪裏安裝和工作。

這意味着您將需要使用其他機制找出程序所在的位置。考慮使用環境變量或命令行參數來允許用戶指定實際路徑,如果您的平臺沒有爲您提供查找可執行文件所在位置的方法。您可以使用自己正常安裝位置的知識作爲後備選項。

對於您的實際問題,如果您可以構建程序的絕對路徑(使用除預處理器指令之外的其他機制) - 請使用它。否則,回到讓系統找你。

+0

我同意,雖然他沒有說如果預處理器的宏是由configure(1),例如(這將是錯誤的),或通過生成文件(這將是件好事)設置。 – 2010-02-04 23:47:45

1

你一定要讓用戶指定帶有環境變量的路徑到已安裝的二進制文件。並非所有的系統都是一樣的,許多人都希望把他們的高管放在不同的地方。

我能想到的最好的例子是進行本地安裝和系統安裝的人員。如果您的程序安裝在用戶必須設置的主目錄中,並且env變量說明二進制文件被複制到的位置。

1

如果您完全確定路徑名,並且它們不是「熟知的」命令(例如,Unix上的POSIX shell實用程序是「衆所周知的」),則應該指定路徑名,否則不要指定完整路徑,或讓用戶通過使用環境變量來控制它。

實際上,您可能可以寫一些像int my_system(const char *);這樣的函數,它爲您創建路徑的前綴。如果稍後您確定這是一個糟糕的主意,那麼只需將my_system()system()相同即可。

0

我不知道這是否是最好的做法,但我在這些情況下,做的是我寫我的C代碼延長PATH環境變量包括安裝目錄末。然後我只使用PATH。這樣,如果用戶的PATH想要覆蓋我認爲已安裝的東西的位置,它可以是—,但是如果軟件安裝在一個偏僻的地方,I  可以調用它,而不會強制我的用戶放置目錄$PATH自己。

請注意,擴展的PATH只能運行C程序;我不是在建議改變持續的PATH

+0

我真誠地希望你暫時這樣做(我個人絕對不會這樣做)。 它增加了一個小的性能命中* *每個*命令發佈(不只是由你)。而且,當然,路徑的長度是有限制的(至少在窗口中)。 我喜歡精益,意味着PATH,最好只是o/s目錄,我強烈不喜歡懶惰的程序員,他們將目錄添加到路徑只是因爲它使事情變得更容易(並且不關心它對我的影響) – Mawg 2010-02-05 00:26:17

+0

@mawg:暫時的確如此。我編輯了我的答案。就性能而言,你可能會注意到它在一臺速度較慢的服務器上,但它並不適用於每一個命令,僅僅用於(a)從這個C程序調用並且(b)沒有找到的命令。 C程序的用戶不應該看到PATH變化。 此外,我猜你管理自己的機器,並且從來不必處理不允許你安裝在OS目錄中的BOFH。這不是懶惰,這是法西斯主義,但它是非常真實的。 – 2010-02-05 02:07:13

相關問題