Makefile의 rm -r은 디렉토리를 삭제하지 않습니다

Makefile의 rm -r은 디렉토리를 삭제하지 않습니다

웹사이트를 확인하려고 하는데HTML 교정기규칙을 사용 Makefile하고 마지막에 임시 폴더를 삭제하십시오.

이 작업을 수행하려면 한 콘솔에서 서버를 시작하고 다른 콘솔에서 다음 규칙을 실행합니다.

SHELL := /bin/bash
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
VIRTUALENV_BIN=~/.virtualenvs/example/bin
PYTHON=$(VIRTUALENV_BIN)/python
PIP=$(VIRTUALENV_BIN)/pip
MANAGE=$(PYTHON) workouts/manage.py

WGET=/usr/bin/wget
HTMLPROOFER=/usr/local/bin/htmlproofer
TEMP_DIR_HTMLPROOF=$(shell mktemp -d)
.ONESHELL:
htmlproofer:
    cd $(TEMP_DIR_HTMLPROOF)
    $(WGET) --recursive --html-extension --convert-links --domains localhost --no-parent localhost:8000
    - $(HTMLPROOFER) .
    echo $(TEMP_DIR_HTMLPROOF)
    cd ..
    rm -r $(TEMP_DIR_HTMLPROOF)

임시 폴더를 생성하고 전체 웹 사이트를 다운로드한 후 html-proofer를 사용하여 검사를 수행하고 마지막으로 임시 폴더 삭제를 시도합니다. 어떤 이유로 폴더를 삭제할 수 없습니다.

운이 없더라도 시도했지만 rm -rf임시 폴더는 항상 거기에 있지만 내용은 없습니다.

생성된 임시 폴더의 이름이 다음과 같다고 가정합니다. /tmp/tmp.l21wiSkYdz명령을 실행한 후 wget다운로드한 웹 사이트가 포함되지만 /tmp/tmp.l21wiSkYdz/localhost+8000이후에는 rm빈 폴더로 유지됩니다 /tmp/tmp.l21wiSkYdz.

내가 작동하게 한 유일한 방법은 다음 rm과 같이 대화식으로 사용하는 것입니다 rm -ir.

임시 폴더를 완전히 삭제하는 방법이나 삭제를 피할 수 있는 이유에 대한 아이디어가 있습니까?

몇 가지 참고사항:

  • .ONESHELL:동일한 서브셸에서 각 줄을 실행합니다.
  • 앞의 대시를 사용하면 html-proofer임시 폴더를 삭제하지 않고 스크립트 종료 가능성을 무시할 수 있습니다.
  • 사용세게 때리다 SHELL := /bin/bash

답변1

@RakeshSharma가 의견에서 지적했듯이 단일 변수 할당을 사용했기 =때문에 실행 시간으로 연기되어 두 번 실행되었습니다.

스크립트가 두 번째로 변수에 액세스하려고 시도하면 다시 실행되어 다른 임시 폴더가 생성됩니다.

사용하기 =위해 변경:=즉각적인확장명이므로 임시 폴더를 한 번 생성합니다.

~에서

TEMP_DIR_HTMLPROOF=$(shell mktemp -d)

이와 관련하여

TEMP_DIR_HTMLPROOF:=$(shell mktemp -d)

답변2

내가 보는 첫 번째 질문.

당신은 당신의 명령을 가지고

cd somewhere
do something

make는 각 라인마다 새로운 쉘을 생성합니다. 따라서 쉘을 생성하고, 이 쉘의 현재 작업 디렉터리를 변경하고, 쉘을 닫고, 새 쉘을 생성한 다음 작업을 수행합니다. 이것이 지금 당신이 원하는 것입니다.

당신은 할 필요가

cd somewhere; do something

htmlproofer:
    cd $(TEMP_DIR_HTMLPROOF); $(WGET) --recursive --html-extension --convert-links --domains localhost --no-parent localhost:8000 - $(HTMLPROOFER) . ;echo $(TEMP_DIR_HTMLPROOF)
    rm -r $(TEMP_DIR_HTMLPROOF)

note는 cd ..쉘 스크립트에서 잘못된 작업을 수행하지만 여기서는 아무 작업도 수행하지 않으며(위 참조) 필요하지 않습니다(위 참조). 비록 pushd와 popd가 더 좋지만 쉘 스크립트에서는 이것이 cd -당신이 하고 싶은 일입니다.

관련 정보