2013-04-16 53 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

相关问题