rm -r dentro do Makefile não removendo o diretório

0

Estou tentando verificar um site com html-proofer com uma regra Makefile e excluir uma pasta temporal quando termina.

Para fazer isso funcionar, inicio um servidor em um console e, em outro, executo a seguinte regra:

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)

Ele cria uma pasta temporal, faz o download de todo o site, realiza a verificação com o html-proofer e, por último, tenta excluir a pasta temporal. Por algum motivo, não consigo excluir a pasta.

Eu tentei mesmo com rm -rf sem sorte, a pasta temporal está sempre lá (mas sem conteúdo), por exemplo:

Suponha que a pasta temporal criada tenha o nome: /tmp/tmp.l21wiSkYdz , depois de executar o comando wget , ele conterá o site baixado como /tmp/tmp.l21wiSkYdz/localhost+8000 , mas após o rm ele ainda estará lá como uma pasta vazia: /tmp/tmp.l21wiSkYdz .

A única maneira de fazer isso funcionar foi com um uso interativo de rm como: rm -ir .

Alguma idéia para remover completamente a pasta temporal ou por que ela pode estar evitando excluí-la?

Algumas notas:

  • .ONESHELL: executa cada linha na mesma subshell
  • o traço antes de html-proofer ignora a possível saída do script sem remover a pasta temporal
  • usando bash SHELL := /bin/bash
por marcanuy 23.06.2017 / 20:25

2 respostas

1

Como @RakeshSharma apontou nos comentários, eu estava usando a atribuição de variável com um único = , então foi adiada para o tempo de execução, executando-a duas vezes.

Na segunda vez em que o script tentou acessar a variável, ela foi executada novamente e criou outra pasta temporal.

A alteração de = com := faz com que use a expansão imediata , por isso cria uma vez a pasta temporal.

De

TEMP_DIR_HTMLPROOF=$(shell mktemp -d)

para isso

TEMP_DIR_HTMLPROOF:=$(shell mktemp -d)
    
por 24.06.2017 / 04:15
0

O primeiro problema que vejo.

você tem como seus comandos

cd somewhere
do something

make cria um novo shell para cada linha. Assim, ele criará um shell, alterará este diretório de trabalho atual de shells, fechará o shell, criará um novo shell e fará algo. Agora é isso que você quer.

você precisa fazer

cd somewhere; do something

ou seja,

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 que cd .. faria a coisa errada (em um shell script), mas aqui não faz nada (veja acima), e não é necessário (veja acima). Em um script de shell cd - seria o que você estava tentando fazer, embora pushd e popd sejam melhores.

    
por 23.06.2017 / 20:33

Tags