我正在使用 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 服务器的响应能力。
似乎通过编辑器修改文件会修改索引节点,导致再次检查它,但附加重定向则不会。