0

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

4

2 回答 2

8

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

bash手册页:

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

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

  • 使用 bash 内部的东西而不是产生工作量小的进程(如cutor );sed
  • 在必须生成外部进程的地方做出更好的选择。

作为第一个示例,提取字符串的第一个字符:

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

这是一个可怕的想法,因为它必须产生进程来完成这项工作。您可以通过以下方式快速执行完全相同的操作bash

firstchar=${string:0:1}

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

第二点只是确保您在运行子流程时为工作选择最佳工具。例如,当可以使用非常简单的单行代码完成时,不要使用包含多个grep,cut和命令的大量管道。sedawk

于 2013-03-16T03:57:21.393 回答
0

除了已经提到的关于优化bash脚本的内容之外,另一种选择是不使用bash,而是使用更轻量级的 shell(例如sh):bash很大并且启动时间相对较长。如果你的脚本的执行时间很短,它实际上可能被bash启动所支配。

于 2019-10-25T11:13:21.327 回答