Как расширить подстановочный знак внутри блока кода оболочки в Makefile?

Я получил этот скрипт, который читает часть моего файла с разделителями .gitignore и удаляет все файлы после данной метки # #:

# https://stackoverflow.com/questions/55527923/how-to-stop-makefile-from-expanding-my-shell-output
RAW_GITIGNORE_CONTENTS := $(shell while read -r line; do printf "$$line "; done < ".gitignore")
GITIGNORE_CONTENTS := $(shell echo "$(RAW_GITIGNORE_CONTENTS)" | sed -E $$'s/[^\#]+\# //g')

# https://stackoverflow.com/questions/4210042/exclude-directory-from-find-command
DIRECTORIES_TO_CLEAN := $(shell /bin/find -not -path "./**.git**" -not -path "./pictures**" -type d)

clean:
#   https://stackoverflow.com/questions/10586153/split-string-into-an-array-in-bash
#   https://stackoverflow.com/questions/11289551/argument-list-too-long-error-for-rm-cp-mv-commands
    readarray -td' ' GARBAGE_DIRECTORIES <<<"$(DIRECTORIES_TO_CLEAN) "; \
    unset 'GARBAGE_DIRECTORIES[-1]'; \
    declare -p GARBAGE_DIRECTORIES; \
    readarray -td' ' GARBAGE_EXTENSIONS <<<"$(GITIGNORE_CONTENTS) "; \
    unset 'GARBAGE_EXTENSIONS[-1]'; \
    declare -p GARBAGE_EXTENSIONS; \
    for filename in "$${GARBAGE_DIRECTORIES[@]}"; \
    do \
        arraylength = "$${#GARBAGE_EXTENSIONS[@]}"; \
        printf 'Cleaning %s extensions on %s\n' "$${arraylength}" "$$filename"; \
        for extension in "$${GARBAGE_EXTENSIONS[@]}"; \
        do \
            [[ ! -z "$$filename" ]] || continue; \
            [[ ! -z "$$extension" ]] || continue; \
            full_expression = "$${filename}/$${extension}" ;\
            printf '%s\n' "$$full_expression"; \
            rm -v "$$full_expression"; \
        done; \
    done;

Запускаем его со следующим .gitignore файлом:

*.txt
*.var
# Comment #
*.aux

Команда rm не расширяет подстановочные знаки и продолжает говорить мне rm: cannot remove './*.aux': No such file or directory и не удалять файлы *.aux из каталога ./.


Обновлять

После вопроса о комментарии @Beta я упростил Makefile до этого:


GITIGNORE_CONTENTS := "*.aux" "*.lof"
DIRECTORIES_TO_CLEAN := "./setup/cache" "./setup/cache/chapters"

clean:
    readarray -td' ' GARBAGE_DIRECTORIES <<<"$(DIRECTORIES_TO_CLEAN) "; \
    unset 'GARBAGE_DIRECTORIES[-1]'; \
    declare -p GARBAGE_DIRECTORIES; \
    readarray -td' ' GARBAGE_EXTENSIONS <<<"$(GITIGNORE_CONTENTS) "; \
    unset 'GARBAGE_EXTENSIONS[-1]'; \
    declare -p GARBAGE_EXTENSIONS; \
    for filename in "$${GARBAGE_DIRECTORIES[@]}"; \
    do \
        arraylength = "$${#GARBAGE_EXTENSIONS[@]}"; \
        printf 'Cleaning %s extensions on %s\n' "$${arraylength}" "$$filename"; \
        for extension in "$${GARBAGE_EXTENSIONS[@]}"; \
        do \
            [[ ! -z "$$filename" ]] || continue; \
            [[ ! -z "$$extension" ]] || continue; \
            full_expression = "$${filename}/$${extension}" ;\
            printf '%s\n' "$$full_expression"; \
            rm -vf "$$full_expression"; \
        done; \
    done;

Какие результаты на этом выходе после его запуска:

$ make
readarray -td' ' GARBAGE_DIRECTORIES <<<""./setup/cache" "./setup/cache/chapters" "; \
unset 'GARBAGE_DIRECTORIES[-1]'; \
declare -p GARBAGE_DIRECTORIES; \
readarray -td' ' GARBAGE_EXTENSIONS <<<""*.aux" "*.lof" "; \
unset 'GARBAGE_EXTENSIONS[-1]'; \
declare -p GARBAGE_EXTENSIONS; \
for filename in "${GARBAGE_DIRECTORIES[@]}"; \
do \
        arraylength = "${#GARBAGE_EXTENSIONS[@]}"; \
        printf 'Cleaning %s extensions on %s\n' "${arraylength}" "$filename"; \
        for extension in "${GARBAGE_EXTENSIONS[@]}"; \
        do \
                [[ ! -z "$filename" ]] || continue; \
                [[ ! -z "$extension" ]] || continue; \
                full_expression = "${filename}/${extension}" ;\
                printf '%s\n' "$full_expression"; \
                rm -vf "$full_expression"; \
        done; \
done;
declare -a GARBAGE_DIRECTORIES=([0] = "./setup/cache" [1] = "./setup/cache/chapters")
declare -a GARBAGE_EXTENSIONS=([0] = "*.aux" [1] = "*.lof")
Cleaning 2 extensions on ./setup/cache
./setup/cache/*.aux
./setup/cache/*.lof
Cleaning 2 extensions on ./setup/cache/chapters
./setup/cache/chapters/*.aux
./setup/cache/chapters/*.lof

Больше упрощения

Я сократил до более простой версии, которая может быть:

clean:
    rm -v "./setup/cache/*.aux";

Запустив это, также не удаляйте файлы:

$ make
rm -v "./setup/cache/*.aux";
rm: cannot remove './setup/cache/*.aux': No such file or directory
make: *** [Makefile:3: clean] Error 1

$ ls ./setup/cache/*.aux
./setup/cache/main.aux

Выше, после запуска ls, вы можете видеть, что файл все еще существует, и он там.

Какую команду вы видите? Что происходит, когда вы упростить make-файл?

Beta 06.04.2019 04:35

@Beta Я обновил вопрос, максимально упростив его.

user 06.04.2019 05:10

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

Beta 06.04.2019 05:32

@Бета, спасибо за помощь! Если вы знаете, почему это сработало, вы можете опубликовать ответ!

user 06.04.2019 06:12

Bash расширяет подстановочные знаки без кавычек. Без двойных кавычек команда rm *aux становится rm main.aux, но с двойными кавычками rm пытается удалить файл с именем *.aux, а такого файла нет.

Beta 07.04.2019 02:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось исправить это, изменив:

    rm -vf "$$full_expression"; \

К:

    rm -vf $${full_expression}; \

Другие вопросы по теме