在我的perl腳本的中間,我想執行一個bash命令。該腳本需要很長時間,所以在腳本的開頭我想看看命令是否存在。 This answer說只是試着運行它,this other answer建議一些bash命令來測試程序是否存在。檢查程序是否存在
後者選項是最佳解決方案嗎?有沒有更好的方法在perl中執行此檢查?
在我的perl腳本的中間,我想執行一個bash命令。該腳本需要很長時間,所以在腳本的開頭我想看看命令是否存在。 This answer說只是試着運行它,this other answer建議一些bash命令來測試程序是否存在。檢查程序是否存在
後者選項是最佳解決方案嗎?有沒有更好的方法在perl中執行此檢查?
我最好的猜測是,你要檢查您要使用system
或qx//
但是,如果您希望命令行的行爲與shell相同,那麼您可以使用File::Which
對我來說,似乎最適合運行程序本身(與-V
說),每個鏈接。我將使用與稍後用於運行作業相同的調用(通過shell或不通過execvp
)。確保你知道它是否拋出錯誤。這也在你的鏈接討論,但我會實際上得到的輸出(而不是發送它)並檢查。這可能是最確定的方式,看看這個東西是否真的在運行,以及它是否是你期望的。
使用-x
(如果您知道路徑)檢查可執行文件也很有用,但它只會告訴您具有給定名稱的文件存在並且它是可執行文件。
該系統的which
似乎被批評爲可能的(錯誤)行爲,它可能是也可能不是一個shell內建的(這正確地使用它會複雜化),是一種外部效用,它的確切行爲是依賴於系統的。在Borodin的答案中指出的模塊File::Which
會更好 - 如果確實比which
更好。 (這可能是,我只是不知道。)
從一開始您的處理是否依賴於此?如果沒有,您可能希望在最適合您的代碼的位置執行此操作。我喜歡在實際使用之前或之後堅持這種檢查,如果其他處理按照它的方式進行的話。無論如何,支票是使用它的一部分。
注。我不知道什麼「bash命令」是指:內置的bash shell,還是在終端上使用bash的事實? Perl的qx
和system
使用了sh
shell,而不是bash
(如果它們調用shell,這取決於你如何使用它們)。有差異,你不能依賴你的shell配置。如果必須的話,你也可以運行一個shell,qx(/path/bash -c 'comm args')
。注意報價。您可能需要使用它來查找系統上的確切語法。例如,請參閱this post(bash-in-qx)。
你打算立即調用命令嗎? – ikegami
@ikegami不,它的一半通過腳本 – flakes
然後只是運行它是沒有意義的。 – ikegami