透過 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 伺服器的響應能力。

似乎透過編輯器修改檔案會修改索引節點,導致再次檢查它,但附加重定向則不會。

相關內容