/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
оболочка должна быть выбрана автором make-файла. Кроме того, средство записи make-файла не может требовать использования альтернативной оболочки и все же считает, что make-файл является переносимым. Хотя было бы возможно стандартизировать механизм указания альтернативной оболочки, существующие реализации не согласны с таким механизмом, и разработчики make-файлов уже могут вызывать альтернативную оболочку, указав имя оболочки в правиле для цели; например:
python -c "foo"
bash
в Makefile или любом другом решении проблемы diff без использования временных файлов?SHELL
чтобы/bin/bash
в Makefile.bash -c
.