У мене виникла проблема з запуском рядка коду в моєму файлі Makefile, який добре працює /bin/bash
. Я знаю, що Марс працює /bin/sh
так що у мене є вирішив цю проблему з цим посібником оголосивши, що я хочу, щоб він працював у Bash. Однак, навіть якщо я запускаю Make in Bash, я все ще не можу отримати цю лінію на роботу, навіть важко, вона працює в Bash просто чудово.
Чому Bash кидає помилку при запуску rm -f !(2).txt
в Makefile, але не коли виконується в його оболонці?
EDIT: Я намагаюсь видалити всі файли з певним розширенням файлів, крім одного з цих файлів. Команда
rm -f !(2).txt
робить саме це в моєму баш-терміналі, але не в Make.EDIT: Бігаючи
rm -f !(2).txt
"нормально" в терміналі з Bash (термінал повернутоbash
при видачі командиecho "$0"
) він працює чудово, але сироватка я біжу/bin/bash -c "rm -f !(2).txt"
Я отримую ту саму помилку, що і в Makefile.
all: clean
clean: SHELL:=/bin/bash
clean:
rm -f !(2).txt
Запуск команди в Bash
$ ls
1.txt 2.txt 3.txt 4.txt Makefile # Directory has all text files
$ rm -f !(2).txt # Remove all text files but 2.txt
$ ls
2.txt Makefile # Only 2.txt is not removed
Запуск команди в Bash через Makefile
$ ls # Directory has all text files
1.txt 2.txt 3.txt 4.txt Makefile
$ make clean # Running make
rm -f !(2).txt
/bin/bash: -c: line 0: syntax error near unexpected token `("
/bin/bash: -c: line 0: `rm -f !(2).txt"
make: *** [clean] Error 1
Відповіді:
2 для відповіді № 1Вам потрібно ввімкнути extglob
Варіант оболонки для того, щоб він працював. В GNU make це може бути досягнуто завдяки
SHELL := /bin/bash
.SHELLFLAGS := -O extglob -c
Редагувати за автором запитання
Приклад із двома рядами коду вище не працював для мене, але як цей співробітник дізнався, здається, існує інше рішення в залежності від версій.
Хмм Чомусь
.SHELLFLAGS
не працював для мене, але вставляв прапори прямо вSHELL=/bin/bash -O extglob -c
зробив. [...] - Тімоті Джонс
Приклад @choroba використовує роботи в Make 4.0, але не працював для мене з моменту створення 3.81. Однак тут є моє рішення:
all: clean
clean: SHELL=/bin/bash -O extglob -c
clean:
rm -f !(2).txt
0 для відповіді № 2
Зробити не має поняття, що "! (2) .txt" означає, якщо ви дійсно повинні використовувати цю конструкцію, то використовуйте функцію $ (shell):
%(shell rm -f !(2).txt)
Особисто я хотів би змінити схему імен файлів або створити імена файлів, які ви хочете видалити, у змінній make.