나에게 이런 일이 일어날 것이라고는 전혀 생각하지 못했지만, 여기 있습니다.¯\_(ツ)_/¯
소스 코드를 먼저 보지 않고 잘못된 디렉터리 내부의 저장소에서 빌드 스크립트를 실행했습니다. 스크립트는 다음과 같습니다 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
.config
Pictures 및 Desktop과 같은 일부 표준 XDG 디렉토리는 사라졌지만 .bashrc는 여전히 존재합니다. .nix-channels
여전히 존재하지만 .nix-defexpr
핵무기에 의해 파괴되었습니다.
따라서 이는 두 가지 질문을 제기합니다.
- 무엇이 잘못되었나요?앞으로 이런 일이 발생하지 않도록 이 빌드 스크립트를 수정하고 홍보를 하고 싶습니다.
- 파일은 어떤 순서로 삭제되나요?분명히 알파벳순은 아니지만
*
알파벳순으로 확장되어 있으므로 여기서는 다른 일이 벌어지고 있는 것처럼 보입니다.
답변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 ..
처음에 디렉터리 깊이가 세 수준 이하인 경우 cd debug
네 번째 수준에 도달하면 현재 디렉터리는 이제 루트 디렉터리가 됩니다. 4개의 디렉토리 수준으로 시작한 경우 현재 디렉토리는 이제 입니다 /home
.
mkdir -p cmake-build-local
/
또는 쓰기 권한이 없기 때문에 이 작업은 실패합니다 /home
.
cd cmake-build-local
디렉토리가 없기 때문에 실패합니다 cmake-build-local
.
이제 우리는...
파일은 어떤 순서로 삭제되나요?
rm -rf *
이는 현재 디렉토리(예: /
또는 ) 의 모든 파일을 재귀적으로 삭제하려고 시도합니다 /home
. 홈 디렉터리는 알파벳순으로 열거되지만 아래 파일은 디렉터리 순회 순서에 관계없이 열거됩니다. 동일한 순서입니다 ls --sort=none
( rm
어떤 이유로든 다른 순서를 사용하기로 결정하지 않는 한). 이 순서는 일반적으로 백업에서 유지되지 않으며 디렉터리에서 파일이 생성되거나 삭제될 때 변경될 수 있습니다.
스크립트를 수정하는 방법
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
(예상했던 것보다 한 수준 높기 때문에 오류가 발생합니다).
그 다음에. 에서 동일한 스크립트를 실행하려고 합니다 ~/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
, cdrom
, dev
등 etc
). 나열된 각 디렉터리는 "디렉터리 순서"(정렬되지 않음)에 따라 반복적으로 처리됩니다.
당신이 해야 할 일:
#!/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
첫 번째는 cd
실패하고, 두 번째는 cd
폴더로 이동한 다음 홈 디렉터리 위 어딘가에 놓을 것입니다(아마도 해당 디렉터리에는 cd ../../..
일반적 으로 아무것도 만들 수 있는 권한이 없으므로 후속 작업 은 실패할 것입니다). 그런 다음 홈 디렉토리로 확장하여 내용을 반복적으로 작업하세요. 삭제 순서는 무작위입니다(디렉토리 항목은 특정 순서가 아닙니다).cd ..
/home
mkdir
cd
*
rm -rf