/ / Чому не підтримувати bash (...) шаблони під час виконання через make (w / SHELL: = / bin / bash)? - linux, bash, shell, makefile

Чому не буде підтримувати bash (...) шаблони при виконанні через make (w / SHELL: = / bin / bash)? - linux, bash, shell, makefile

У мене виникла проблема з запуском рядка коду в моєму файлі 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.