通过 vim/nano 等编辑器写入文件与在 shell 中通过输出重定向写入文件有什么区别?

通过 vim/nano 等编辑器写入文件与在 shell 中通过输出重定向写入文件有什么区别?

我正在使用 macOS已启用。我正在弄清楚为什么脚本在修改或创建后使用 SIP 运行得如此缓慢。

而且我发现如果我用vim或者nano等编辑器修改一个脚本,然后用 运行它./script.bash,每次修改后第一次完成脚本大约需要1秒的时间。

例如。如果 script.bash 是:

#!/bin/bash
echo 1

我将其更改为以下vim。我花了大约十倍的时间来运行它。

#!/bin/bash
echo 1
echo 2
bash-3.2$ time ./script.bash # First time after modification by vim
1
2

real    0m0.884s
user    0m0.001s
sys 0m0.002s
bash-3.2$ time ./script.bash # Second time after modification by vim
1
2

real    0m0.003s
user    0m0.001s
sys 0m0.002s

虽然如果我当前通过某些命令的输出重定向(如)附加文件echo "echo 3" >> script.bash,但仍然通过 调用脚本./script.bash,则延迟消失了。

bash-3.2$ echo "echo 3" >> script.bash
bash-3.2$ time ./script.bash # First time after modification by echo
1
2
3

real    0m0.004s
user    0m0.001s
sys 0m0.002s
bash-3.2$ time ./script.bash # Second time after modification by echo
1
2
3

real    0m0.002s
user    0m0.001s
sys 0m0.001s

那么这两种写文件的方式有什么区别呢?为什么延迟只发生在启用?

答案1

我发现本文我相信这解释了你的问题。

苹果引入了公证,抛开这给我们开发者带来的不便不谈,它也导致了用户体验的下降,因为用户第一次运行新的可执行文件时,苹果会在等待服务器回复时延迟执行。对我来说,这项检查需要将近一秒钟的时间。

这不仅适用于从互联网下载的文件,也不仅仅适用于通过 Finder 启动它们,这就是一切。因此,即使您编写一行 shell 脚本并在终端中运行它,您也会遇到延迟!

至于公证检查,结果被缓存,所以第二次调用应该很快,但如果你是开发人员,你可能会定期更新你的脚本和二进制文件,这会触发新的检查(看起来缓存是基于inode的,所以更新-就地保存可能会避免触发新的检查),或者您可能拥有涉及动态创建和执行脚本的工作流程,其性能现在取决于 Apple 服务器的响应能力。

似乎通过编辑器修改文件会修改索引节点,导致再次检查它,但附加重定向则不会。

相关内容