
我正在使用 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 伺服器的響應能力。
似乎透過編輯器修改檔案會修改索引節點,導致再次檢查它,但附加重定向則不會。