加速Bash脚本

时间:2013-03-16 03:53:22

标签: bash optimization

我正在编写一个半实时bash脚本,它的运行速度不够快。根据我的理解,Bash引用某种表来查找您提供它的命令的完整路径。指定完整路径会显着加快循环中运行的命令吗?

2 个答案:

答案 0 :(得分:6)

不太可能。 <{1}} shell实际上会缓存它找到的可执行文件,因此只有第一次搜索会很慢。

来自bash联机帮助页:

  

如果名称既不是shell函数也不是内置函数,并且不包含斜杠,则bash会在PATH的每个元素中搜索包含该名称的可执行文件的目录。 Bash使用哈希表来记住可执行文件的完整路径名(请参阅下面的SHELL BUILTIN命令下的哈希)。只有在哈希表中找不到该命令时,才会执行PATH中目录的完整搜索。

加速bash脚本通常采取两种形式:

  • 使用bash内部资源而不是产生工作负载的产生进程(如bashcut);和
  • 在必须产生外部流程的地方做出更好的选择。

作为第一个例子,用:

提取字符串的第一个字符
sed

是一个可怕的想法,因为它必须产生进程来完成工作。您可以使用以下内容快速在firstchar=$(echo $string | cut -c1-1) 中执行完全相同的操作:

bash

没有产生子流程的相对巨大的成本。

第二点是确保在运行子流程时为工作选择最佳工具。例如,如果可以使用非常简单的firstchar=${string:0:1} 单行,则不要使用多个grepcutsed命令的大量管道。

答案 1 :(得分:0)

除了关于优化bash脚本的说法外,另一种选择不是使用bash,而是使用更轻量级的shell(例如sh):{{1} }很大,并且启动时间相对较长。如果脚本的执行时间很短,则实际上可以由bash启动来控制。