Выполнение рецептов
При выполнении рецептов для обновления целевого объекта они выполняются путем вызова новой подоболочки для каждой строки рецепта, если не установлен специальный целевой объект .ONESHELL (см. Использование одной оболочки) (на практике, make может использовать сокращения, не влияющие на результаты.)
Обратите внимание: это подразумевает, что установка переменных оболочки и вызов команд оболочки, таких как cd, которые устанавливают контекст локально для каждого процесса, не повлияют на последующие строки в рецепте.3 Если вы хотите использовать cd для воздействия на следующее утверждение, поместите оба утверждения в одну строку рецепта. Тогда make вызовет одну оболочку для выполнения всей строки, и оболочка выполнит утверждения последовательно. Например:
foo : bar/lose
cd $(<D) && gobble $(<F) > ../$@
Здесь мы используем оператор оболочки AND (&&) таким образом, что если команда cd завершится неудачно, сценарий завершится неудачно, не пытаясь вызвать команду gobble в неправильном каталоге, что может вызвать проблемы (в данном случае это, безусловно, приведет к усечению ../foo, по крайней мере).
| • Одна оболочка | Одна оболочка для всех строк в рецепте. | |
| • Выбор оболочки | Как make выбирает оболочку, используемую для выполнения рецептов. |
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Execution.html