Bash

我剛剛刪除了主目錄中的所有內容。如何?為什麼有些文件還在那裡?

  • May 14, 2021

從來沒有想過這會發生在我身上,但是你去。¯\_(ツ)_/¯

我從錯誤目錄中的儲存庫執行建構腳本,而沒有先查看原始碼。這是腳本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被核彈了。

所以,這讓我想到了兩個問題:

  1. **什麼地方出了錯?**我想修復此建構腳本並進行 PR 以防止將來發生這種情況。
  2. **文件刪除的順序是什麼?**顯然不是按字母順序,而是按字母順序*擴展,所以這裡似乎發生了其他事情。

哎喲。你不是第一個受害者

什麼地方出了錯?

從您的主目錄開始,例如/home/felix,甚至在/home/felix/srcor中/home/felix/Downloads/src

cd ../Dependencies/cpython

失敗,因為沒有../Dependencies.

mkdir debug
cd debug

您現在位於debug您開始的目錄的子目錄中。

../configure --with-pydebug --enable-shared
make

什麼都不做,因為沒有../configureor make

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,可以)。

引用自:https://unix.stackexchange.com/questions/649408