/bin/sh
може бути bash
у вашій системі, але при виклику як sh
, bash
він працюватиме в режимі POSIX (як би POSIXLY_CORRECT
було визначено, або це було запущено з --posix
).
У цьому режимі заміни процесів не існують.
Рішення:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Альтернатива:
all:
bash -c "diff <(command1) <(command2)"
Або просто визначте змінну Makefile SHELL
як /bin/bash
:
SHELL=/bin/bash
Якщо ви хочете портативність, перейдіть з першим рішенням. Якщо ви все в порядку, залежно від bash
, виберіть друге. Якщо вам додатково не потрібно дбати про не-GNU make
реалізацію, скористайтеся третьою.
Що стосується налаштування SHELL
: Стандарт POSIX каже , що виконувані файли в Makefiles повинні викликатися з system()
бібліотечної функцією C допомоги make
. Ця функція не гарантує використання SHELL
змінної середовища (насправді, це відмовляє стандарту). Стандарт також іде на деяку довжину, щоб сказати, що встановлення змінної Makefile SHELL
не повинно впливати на змінну середовища SHELL
. Однак у більшості реалізацій, про make
які я знаю, змінна Makefile SHELL
буде використовуватися для виконання команд.
Пропозиція в Обгрунтування make
корисної програми полягає у використанні bash -c
:
Історичну MAKESHELL
особливість та пов'язані з ними функції, надані іншими make
реалізаціями, були опущені. У деяких реалізаціях він використовується, щоб дозволити користувачеві замінити оболонку для використання make
команд. Це було заплутано; для портативного make
, оболонку повинен вибирати автор, що працює з файлами. Крім того, автори makefile не можуть вимагати використання альтернативної оболонки, і все ще вважають makefile переносним. Хоча можна було б стандартизувати механізм визначення альтернативної оболонки, існуючі реалізації не погоджуються на такий механізм, і автори makefile вже можуть викликати альтернативну оболонку, вказавши ім'я оболонки в правилі для цілі; наприклад:
python -c "foo"
bash
в Makefile або будь-якому іншому вирішенні проблеми diff без використання тимчасових файлів?