是否可以在 shell 脚本中缓存外部二进制文件?

是否可以在 shell 脚本中缓存外部二进制文件?

我的问题可能听起来有点奇怪,但今天早上我读到了这个问题:
为什么“回声”比“触摸”快得多?
我完全理解内置函数的概念,但我不知道你是否也举同样的例子:

#!/bin/bash (or any other shell if it's possible in another)
for file in `find . -name "*.xml"`;
do 
   touch $file; 
done

是否有可能进行预加载,touch这样您就不需要每次使用它时都分叉它,然后变得更快?

答案1

实际上,内核会将可执行文件及其所需的任何文件(例如库)缓存在 RAM 中。

shell 没有办法做任何事情。如果是外部程序,则需要执行。 Unices(不包括像 Cygwin 这样的 UNIX 模拟层)往往会使加载程序变得非常高效,但它永远不会像执行内置命令那么快。

您可以通过将呼叫分组到 来节省时间touch。首先,你不应该在 的输出上使用命令替换find:这绝对没有优点,但有几个缺点:

  • 如果您的文件名包含空格或通配符,它​​将中断。
  • 它比较慢,因为首先find需要完成对目录树的遍历,然后才开始处理。
  • 它使用更多内存来存储find.

findmake执行命令,而不是循环结果。find是为这种用途而设计的。

find . -name "*.xml" -exec touch {} \;

现在,由于touch可以一次处理多个文件,只需替换\;+,瞧,touch将批量调用包含尽可能多的文件。

find . -name "*.xml" -exec touch {} +

如果您需要 shell 脚本的性能,内置命令总是会击败外部命令,除非您正在操作大量数据。例如,sed如果您有一行文本,则使用 shell 的字符串处理结构比调用要快得多(并且由于引用问题而不易出错) 。另一方面,sed如果您有数百万行要处理,请使用 或其他专用外部工具。

如果您要创建新文件,则可以将 的使用替换touch -- "$file": >"$file"。没有这样的快捷方式可以将现有文件的日期更改为当前时间。

Shell 有一些内置命令,可以作为外部命令实现,但出于性能考虑,这些命令是内部命令。echo就是一个很好的例子。还有一些带有附加内置命令的 shell,可用于外部命令可能被破坏或进程表已满等情况下的救援情况。例如,zsh 附带zsh/files模块包含诸如mkdir和 之类的命令mv,但不包含touch.窗扇-touch内置的。

答案2

find . -name "*.xml" -print0 | xargs -0 touch

学习查找|参数

相关内容