Я часто нахожу синтаксис Bash очень полезным, например, подстановка процесса, как вdiff <(sort file1) <(sort file2)
.
Можно ли использовать такие команды Bash в Makefile? Я думаю о чем-то вроде этого:
file-differences:
diff <(sort file1) <(sort file2) > $@
В моем GNU Make 3.80 это выдаст ошибку, так как он использует shell
вместо bash
выполнения команд.
/bin/sh: -c: line 0: syntax error near unexpected token
('`Ответы:
Из GNU Make документацию,
Так что поместите
SHELL := /bin/bash
в начало вашего make-файла, и вам следует идти дальше.Кстати: вы также можете сделать это для одной цели, по крайней мере, для GNU Make. Каждая цель может иметь свои собственные назначения переменных, например:
Это напечатает:
См. «Значения переменных для конкретной цели» в документации для получения более подробной информации. Эта строка может идти в любом месте Makefile, она не должна быть непосредственно перед целью.
источник
man
. Поговорим о времени. : Pinfo
вообще-то, но, думаю, это действительно помогло Энди. Я знаю, что у меня были такие дни ...SHELL=/bin/bash
как первую строку Makefile (или сразу после комментария).Вы можете позвонить
bash
напрямую, используя-c
флаг:Конечно, вы, возможно, не сможете перенаправить на переменную $ @, но когда я попытался это сделать, я получил
-bash: $@: ambiguous redirect
сообщение об ошибке, так что вы, возможно, захотите разобраться в этом, прежде чем слишком углубиться в это (хотя я используя Bash 3.2. что-то, так что, возможно, ваш работает по-другому).источник
Если важна переносимость, вы можете не зависеть от конкретной оболочки в вашем Makefile. Не во всех средах есть bash.
источник
Вы можете вызывать bash непосредственно в вашем Makefile вместо использования оболочки по умолчанию:
вместо того:
источник
make
игнорируется значение переменной среды SHELL.Есть способ сделать это без явной установки переменной SHELL, указывающей на bash. Это может быть полезно, если у вас много make-файлов, поскольку SHELL не наследуется последующими make-файлами и не берется из среды. Вы также должны быть уверены, что любой, кто компилирует ваш код, настраивает свою систему таким образом.
Если вы запустите
sudo dpkg-reconfigure dash
и ответите «нет» на приглашение, ваша система не будет использовать тире в качестве оболочки по умолчанию. Затем он укажет на bash (по крайней мере, в Ubuntu). Обратите внимание, что использование dash в качестве системной оболочки немного более эффективно.источник
sh
bash работает в режиме совместимости (set -o posix
). Функциональность, которую пытается использовать ОП, процесс подстановки, недоступна в этом режиме.Один из способов, который также работает, это поместить его в первую строку вашей цели:
источник