rm -r внутри Makefile не удаляет каталог

Я пытаюсь проверить веб-сайт с помощью html-proofer с правилом 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 заставляет игнорировать возможный выход из скрипта без удаления временной папки
  • с помощью bash SHELL: = / bin / bash

0
23.06.2017, 23:12
2 ответа

Как отметил @RakeshSharma в комментариях, я использовал присваивание переменных с одним =, поэтому оно было отложено до времени выполнения, выполняя его дважды.

Во второй раз, когда скрипт попытался получить доступ к переменной, он был выполнен снова и создал другую временную папку.

Замена =на :=приводит к использованию расширения immediate, поэтому временная папка создается один раз.

От

TEMP_DIR_HTMLPROOF=$(shell mktemp -d)

до этого

TEMP_DIR_HTMLPROOF:=$(shell mktemp -d)
2
28.01.2020, 02:45

Первая проблема, которую я вижу.

у вас есть команды

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)

примечание cd..приведет к неправильному действию (в сценарии оболочки ),а здесь ничего не делает (см. выше ), и не нужно (см. выше ). В сценарии оболочки cd -будет тем, что вы пытались сделать, хотя pushd и popd лучше.

0
28.01.2020, 02:45

Теги

Похожие вопросы