2013-03-16 89 views
-1

我在寫一個半實時的bash腳本,它的運行速度不夠快。據我所知,Bash引用了某種表格來查找你所提供命令的完整路徑。指定完整路徑是否會顯着加速在循環中運行的命令?加速Bash腳本

+0

你可以自己試試看。運行你的腳本,看看它需要多長時間,然後用指定的路徑再試一次,看看它是否需要更少的時間。 – 2013-03-16 03:56:17

+1

如果您正在尋找加快速度的方法,那麼不要猜測「這會有幫助嗎?」,請粘貼整個腳本,然後讓我們識別可能的熱點或您做錯的事情。 – 2013-03-16 03:57:04

+0

在大多數shell腳本中,外部進程是最大的開銷。例如,如果你想要一個文件列表不使用'ls',使用'echo *',任何對'cat'的使用都可能沒有被使用,等等。你無法完全避免外部程序,但儘可能減少它們的使用(這也會減少PATH搜索)。 – cdarke 2013-03-16 11:05:04

回答

6

不太可能。 bash shell實際上會緩存它找到的可執行文件,所以只有第一次搜索會很慢。

bash手冊頁:

如果名稱既不是殼函數,也不是一個內置的,並且不包含斜線,bash的搜索路徑的每個元素用於包含該名稱的可執行文件的目錄。 Bash使用散列表來記住可執行文件的完整路徑名(請參閱下面的SHELL BUILTIN COMMANDS下的散列)。只有在散列表中找不到該命令時,纔會執行PATH中目錄的完整搜索。

加快bash腳本通常需要兩件事情的形式:

  • 使用bash內部的東西,而不是產卵進程(如cutsed或),其中工作量小;和
  • 在你必須產生外部進程的地方做出更好的選擇。

作爲第一個例子,提取字符串的第一個字符:

firstchar=$(echo $string | cut -c1-1) 

是一個可怕的想法,因爲它必須產生進程做的工作。你可以像做同樣的事情在bash迅速:

firstchar=${string:0:1} 

沒有產卵子流程的相對鉅額成本。

第二點是確保您在運行子流程時爲工作選擇最佳工具。例如,不要使用多個grep,cutsed命令的大規模流水線,只能使用非常簡單的awk單線程完成。