我剛剛刪除了主目錄中的所有內容。如何?為什麼有些文件還在那裡?
從來沒有想過這會發生在我身上,但是你去。
¯\_(ツ)_/¯
我從錯誤目錄中的儲存庫執行建構腳本,而沒有先查看原始碼。這是腳本
Scripts/BuildLocalWheelLinux.sh
:cd ../Dependencies/cpython mkdir debug cd debug ../configure --with-pydebug --enable-shared make cd ../../.. cd .. mkdir -p cmake-build-local cd cmake-build-local rm -rf * cmake .. -DMVDIST_ONLY=True -DMVPY_VERSION=0 -DMVDPG_VERSION=local_build make -j cd .. cd Distribution python3 BuildPythonWheel.py ../cmake-build-local/[redacted]/core.so 0 python3 -m ensurepip python3 -m pip install --upgrade pip [more pip install stuff] python3 -m setup bdist_wheel --plat-name manylinux1_x86_64 --dist-dir ../dist cd .. cd Scripts
危險的部分似乎是
mkdir -p cmake-build-local cd cmake-build-local rm -rf *
不過仔細想想,好像也不會出錯。
您應該執行此腳本的方式是
cd Scripts; ./BuildLocalWheelLinux.sh
. 當我第一次執行它時,它在最後一行顯示了一個錯誤(我後來了解到)。我很著急,所以我雖然“也許文件已經過時,我會嘗試從項目根目錄執行。所以我跑了./Scripts/BuildLocalWheelLinux.sh
。突然,vscodes 主題和縮放級別發生了變化,我的 zsh 終端配置被重置,終端字型被設置為預設值,一旦我意識到發生了什麼,我就 Ctrl+C’d。剩下一些文件,但它們沒有明顯的模式:
$ ls -la total 216 drwx------ 27 felix felix 4096 May 12 18:08 . drwxr-xr-x 3 root root 4096 Apr 15 16:39 .. -rw------- 1 felix felix 12752 Apr 19 11:07 .bash_history -rw-r--r-- 1 felix felix 3980 Apr 15 13:40 .bashrc drwxrwxrwx 7 felix felix 4096 May 12 18:25 .cache drwx------ 8 felix felix 4096 May 12 18:26 .config drwx------ 3 root root 4096 Apr 13 21:40 .dbus drwx------ 2 felix felix 4096 Apr 30 12:18 .docker drwxr-xr-x 8 felix felix 4096 Apr 15 13:40 .dotfiles -rw------- 1 felix felix 8980 Apr 13 18:10 examples.desktop -rw-r--r-- 1 felix felix 196 Apr 19 15:19 .gitconfig -rw-r--r-- 1 felix felix 55 Apr 16 13:56 .gitconfig.old -rw-r--r-- 1 felix felix 1040 Apr 15 13:40 .gitmodules drwx------ 3 felix felix 4096 May 6 10:10 .gnupg -rw-r--r-- 1 felix felix 1848 May 5 14:24 heartbeat.tcl -rw------- 1 felix felix 1610 Apr 13 20:36 .ICEauthority drwxr-xr-x 5 felix felix 4096 Apr 21 16:39 .ipython drwxr-xr-x 2 felix felix 4096 May 4 09:35 .jupyter -rw------- 1 felix felix 161 Apr 27 14:23 .lesshst drwx------ 3 felix felix 4096 May 12 18:08 .local -rw-r--r-- 1 felix felix 140 Apr 29 17:54 minicom.log drwx------ 5 felix felix 4096 Apr 13 18:25 .mozilla drwxr-xr-x 2 felix felix 4096 Apr 13 18:10 Music drwxr-xr-x 6 felix felix 4096 May 12 17:16 Nextcloud -rw-r--r-- 1 felix felix 52 Apr 16 11:43 .nix-channels -rw------- 1 felix felix 1681 Apr 20 10:33 nohup.out drwx------ 3 felix felix 4096 Apr 15 11:16 .pki -rw------- 1 felix felix 946 Apr 16 11:43 .profile drwxr-xr-x 2 felix felix 4096 Apr 13 18:10 Public drwxr-xr-x 2 felix felix 4096 May 12 18:08 .pylint.d -rw------- 1 felix felix 1984 May 12 18:06 .pythonhist -rw-r--r-- 1 felix felix 2443 Apr 19 13:40 README.md drwxr-xr-x 13 felix felix 4096 May 12 18:08 repos drwxr-xr-x 6 felix felix 4096 Apr 19 11:08 snap drwx------ 3 felix felix 4096 May 5 15:33 .ssh drwxr-xr-x 5 felix felix 4096 Apr 26 17:39 .stm32cubeide drwxr-xr-x 5 felix felix 4096 May 5 15:52 .stm32cubemx drwxr-xr-x 2 felix felix 4096 Apr 23 11:44 .stmcube drwxr-xr-x 2 felix felix 4096 Apr 13 18:10 Templates drwxr-xr-x 3 felix felix 4096 Apr 19 11:57 test drwxr-xr-x 2 felix felix 4096 Apr 13 18:10 Videos -rw------- 1 felix felix 14313 May 12 10:45 .viminfo -rw-r--r-- 1 felix felix 816 Apr 15 13:40 .vimrc drwxr-xr-x 3 felix felix 4096 Apr 16 12:08 .vscode -rw-r--r-- 1 felix felix 2321 Apr 19 18:47 weird_bug.txt -rw-r--r-- 1 felix felix 162 Apr 15 13:40 .xprofile
.config
已經消失了,還有一些標準的 XDG 目錄,如圖片和桌面,但 .bashrc 仍然存在。.nix-channels
還在那裡,但.nix-defexpr
被核彈了。所以,這讓我想到了兩個問題:
- **什麼地方出了錯?**我想修復此建構腳本並進行 PR 以防止將來發生這種情況。
- **文件刪除的順序是什麼?**顯然不是按字母順序,而是按字母順序
*
擴展,所以這裡似乎發生了其他事情。
哎喲。你不是第一個受害者。
什麼地方出了錯?
從您的主目錄開始,例如
/home/felix
,甚至在/home/felix/src
or中/home/felix/Downloads/src
。cd ../Dependencies/cpython
失敗,因為沒有
../Dependencies
.mkdir debug cd debug
您現在位於
debug
您開始的目錄的子目錄中。../configure --with-pydebug --enable-shared make
什麼都不做,因為沒有
../configure
ormake
。cd ../../.. cd ..
如果您從不超過三個目錄級別開始,
cd debug
達到第四級,則目前目錄現在是根目錄。如果您從四個目錄級別開始,則目前目錄現在是/home
.mkdir -p cmake-build-local
這失敗了,因為您無權寫入
/
or/home
。cd cmake-build-local
這失敗了,因為沒有目錄
cmake-build-local
。我們現在開始……
文件刪除的順序是什麼?
rm -rf *
這會嘗試遞歸刪除目前目錄中的每個文件,即
/
or/home
。主目錄按字母順序列舉,但下面的文件按目錄遍歷的任意順序列舉。這是相同的順序ls --sort=none
(除非rm
出於某種原因決定使用不同的順序)。請注意,此順序通常不會保留在備份中,並且可以在目錄中創建或刪除文件時更改。如何修復腳本
首先,幾乎所有的 shell 腳本都應該
set -e
在頂部附近。set -e
如果命令失敗,則導致腳本中止。(如果退出狀態為非零,則命令失敗。)set -e
不是靈丹妙藥,因為在某些情況下它不會生效。但這是您可以期望的最低限度,它會在這裡做正確的事情。(此外,腳本應該以shebang行開頭,以指示要使用哪個 shell,例如
#!/bin/sh
或#!/bin/bash
。但這對解決這個問題沒有幫助。)
rm -rf *
或變體rm -rf $foo.*
(如果$foo
結果是空的怎麼辦?),是脆弱的。在這裡,而不是mkdir -p cmake-build-local cd cmake-build-local rm -rf *
僅刪除並重新創建目錄會更加健壯。(這不會保留對目錄的權限,但這不是問題。)
rm -rf cmake-build-local mkdir cmake-build-local cd cmake-build-local
另一種方法對刪除錯誤文件更有效,但對刪除失去文件更脆弱:僅刪除已知已建構的文件,方法是執行
make clean
具有rm
已知建構目標和已知副檔名的命令(例如rm *.o
,可以)。