ちょうどホームディレクトリのすべてのエントリを削除しました。どのように?一部のファイルがまだ存在するのはなぜですか?

ちょうどホームディレクトリのすべてのエントリを削除しました。どのように?一部のファイルがまだ存在するのはなぜですか?

私にはこのようなことが起こるとは全く考えていませんでしたが、ここにあります。¯\_(ツ)_/¯

最初にソースコードを見ずに、間違ったディレクトリ内のリポジトリでビルドスクリプトを実行しました。スクリプトは次のとおりです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を押しました。

ファイルはいくつか残っていますが、明確なパターンはありません。

$ 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

.configPicturesやDesktopなどのいくつかの標準XDGディレクトリは消えていますが、.bashrcはまだ存在しています。.nix-channelsそれでも存在するが、.nix-defexpr核兵器によって破壊された。

したがって、これは2つの質問を提起します。

  1. 何が間違っていますか?今後このようなことが発生しないように、このビルドスクリプトを修正して宣伝したいと思います。
  2. ファイルはどの順序で削除されますか?明らかにアルファベット順ではありませんが、*アルファベット順に拡張されているので、ここでは他のことが起こっているようです。

答え1

あや。あなたは最初の犠牲者ではありません

何が間違っていますか?

たとえば、ホームディレクトリから始める/home/felixか、/home/felix/srcまたはで始めます/home/felix/Downloads/src

cd ../Dependencies/cpython

何もないので失敗します../Dependencies

mkdir debug
cd debug

debugこれで、スタートアップディレクトリのサブディレクトリにあります。

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

../configureまたはこれがないため、何もしませんmake

cd ../../..
cd ..

最初にディレクトリの深さが3レベル以下の場合、cd debug4番目のレベルに達すると、現在のディレクトリはルートディレクトリになります。 4つのディレクトリレベルで起動した場合、現在のディレクトリは現在です/home

mkdir -p cmake-build-local

/または書き込み権限がないため、この操作は失敗します/home

cd cmake-build-local

ディレクトリがないため失敗しますcmake-build-local

今私たちは...

ファイルはどの順序で削除されますか?

rm -rf *

これは、現在のディレクトリ(/または)のすべてのファイルを再帰的に削除しようとします/home。ホームディレクトリはアルファベット順に列挙されますが、下のファイルはディレクトリ巡回順序に関係なく列挙されます。同じ順序ですls --sort=nonerm何らかの理由で別の順序を使用することを決定しない限り)。この順序は通常バックアップでは維持されず、ディレクトリ内のファイルが作成または削除されたときに変更されることがあります。

スクリプトを変更する方法

set -eまず、ほとんどすべてのシェルスクリプトは上部近くに配置する必要があります。set -eコマンドが失敗すると、スクリプトは中断されます。 (終了状態が0でないとコマンドは失敗します。)set -e機能しない状況があるため、万病痛歯磨きではありません。しかし、これはあなたが期待できる最小値であり、ここでは正しいことを行います。

(スクリプトは次から始める必要があります。シェルボーン#!/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削除します。

答え2

cdスクリプトを実行し~/Distribution/Scripts、各呼び出しが成功すると仮定して呼び出しを追跡しますcd

cd ../Dependencies/cpython

私たちは今~/Distribution/Dependencies/cpython

mkdir debug
cd debug

私たちは今~/Distribution/Dependencies/cpython/debug

cd ../../..

私たちは今~/Distribution

cd ..

今あなたのホームディレクトリにあります。

mkdir -p cmake-build-local
cd cmake-build-local

私たちは今~/cmake-build-localあなたが走っている場所ですrm -rf *

cd ..

それではホームディレクトリに戻りましょう。

cd Distribution

私たちは今~/Distribution

cd ..
cd Scripts

これは現在のステップです~/Scripts(予想よりも1レベル高いため、エラーが発生します)。


それから。で同じスクリプトを実行しようとしています~/Distribution

cd ../Dependencies/cpython

これは失敗しました。これはまだ~/Distribution

mkdir debug
cd debug

あなたは今ここにいます~/Distribution/debug

cd ../../..

あなたは現在の場所にあります~/..(おそらく場所/home)。

cd ..

あなたはおそらく/今そこにいるでしょう。

cd Distribution
mkdir -p cmake-build-local
cd cmake-build-local

「該当するファイルやディレクトリはありません。」そして「権限が拒否されました」のため失敗する可能性があります。

rm -rf *

ユーザーはまだ/そのディレクトリにあり、rmコマンドはファイルシステム全体のすべてのファイルを削除しようとします。権限は、書き込みアクセス権を持つディレクトリ内のファイルのみを削除できるようにするため、/tmpホームディレクトリ内のファイルのみが失われる可能性があります。

コマンドラインにリストされている引数は、拡張された順序でrm処理されます*(辞書順、つまりbin、、、、bootなど)。リストされた各ディレクトリは、「ディレクトリの順序」(ソートされていない)に従って繰り返し処理されます。cdromdevetc


あなたがしなければならないこと:

#!/bin/sh

topdir=$HOME/Distribution

mkdir -p "$topdir/Dependencies/cpython/debug"
(
    cd "$topdir/Dependencies/cpython/debug" || exit 1

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

rm -rf "$topdir/cmake-build-local"
mkdir -p "$topdir/cmake-build-local"
(
    cd "$topdir/cmake-build-local" || exit 1

    cmake .. -DMVDIST_ONLY=True -DMVPY_VERSION=0 -DMVDPG_VERSION=local_build
    make -j
)

(
    cd "$topdir" || exit 1

    python3 BuildPythonWheel.py ../cmake-build-local/[redacted]/core.so 0
    python3 -m ensurepip
    python3 -m pip install --upgrade pip
    python3 -m setup bdist_wheel --plat-name manylinux1_x86_64 --dist-dir ../dist
)

各個々のサブシェルの作業ディレクトリは、( ... )そのサブシェルのローカルディレクトリです。サブシェルの初期値は、cd「外部」環境の作業ディレクトリには影響しません。残りのコードでは、ユーザーシェルセッションの初期作業ディレクトリに依存しない絶対パス名を使用します。特に、このrmコマンドは盲目的に拡張するのではなく、絶対パスを介して指定された特定のディレクトリを*削除することに注意してください。 (ディレクトリが存在しなくても致命的なエラーは発生しません。)

答え3

スクリプトが内部で実行されていると仮定すると、Scriptsどちらもスクリプト作成者が意図したとおりに実行されません。

cd ../Dependencies/cpython
mkdir debug
cd debug
cd ../../..
cd ..
mkdir -p cmake-build-local
cd cmake-build-local

1つ目はcd失敗し、2つ目はcdフォルダに移動してからホームディレクトリの上のどこかに配置します(おそらくそのディレクトリには通常cd ../../..何も作成する権限がないため、後続の操作は失敗します)。次に、ホームディレクトリに展開して内容を繰り返し作業します。削除の順序はランダムです(ディレクトリエントリは特定の順序ではありません)。cd ../homemkdircd*rm -rf

関連情報