2013-04-16 49 views
2

這個問題關注的是使用外部程序而不是內置結構的負面影響 - 特別是關於sed以及一般的外部程序。爲什麼在外部程序中使用內建命令(在bash腳本中)?

我的想法是,爲了最大限度地跨UNIX系統的兼容性,應該使用內建命令。但是,有些計劃幾乎是標準的。考慮下面這個例子:

# Both functions print an array definition for use in 
# assignments, for loops, etc. 

uses_external() { 
    declare -p $1 \ 
     | sed -e "s/declare \-a [^=]*=\'\(.*\)\'\$/\1/" \ 
     | sed "s/\[[0-9]*\]\=//g" 
} 

uses_builtin() { 
    local r=$(declare -p $1) 
    r=${r#declare\ -a\ *=} 
    echo ${r//\[[0-9]\]=} 
} 

在兼容性方面,也有很大uses_builtin()uses_external()之間的差異?

至於兼容性,是有一定的類,它幾乎是普遍的外部程序?有沒有提供這種信息的資源? (對於上面的例子,我不得不盡管許多源來讀取假設sed是更兼容的選擇,而不是awk或第二語言之前,我感覺很舒服。)

我真的要權衡得失,所以感覺免費指出內置命令與外部程序之間的其他考慮(即性能,穩健性,支持等)。或者,「內部vs外部」這個問題通常是按照程序問題嗎?

+0

你有沒有試過計時你的例子?在我的系統上,uses_builtin的運行速度比uses_external快2.5倍。 (當然,如果你重寫uses_external以避免調用sed兩次 - 而且你應該每次調用一個sed命令,那麼內置版本的速度只有兩倍。) – William

回答

1

客觀地說,使用內置命令更有效,因爲你不需要到餐桌的任何新工藝他們。 (主觀地說,這種分叉的開銷可能可以忽略不計。)大量的內置命令可能會被調用外部程序所包含。

使用內置插件可能會產生更多可讀代碼,也可能不會產生更多可讀代碼。這取決於誰在閱讀代碼。

1

直覺相反,內置的是與你的例子是大數據集慢

Parameter expansion slow for large data sets

+0

我注意到當我第一次測試OP的時候功能,並忘記包含一個參數。內置版運行速度非常慢,速度非常慢。 – William

相關問題