When it is time to execute recipes to update a target, they are executed by invoking a new sub-shell for each line of the recipe, unless the .ONESHELL
special target is in effect (see Using One Shell) (In practice, make
may take shortcuts that do not affect the results.)
Please note: this implies that setting shell variables and invoking shell commands such as cd
that set a context local to each process will not affect the following lines in the recipe.2 If you want to use cd
to affect the next statement, put both statements in a single recipe line. Then make
will invoke one shell to run the entire line, and the shell will execute the statements in sequence. For example:
foo : bar/lose cd $(<D) && gobble $(<F) > ../$@
Here we use the shell AND operator (&&
) so that if the cd
command fails, the script will fail without trying to invoke the gobble
command in the wrong directory, which could cause problems (in this case it would certainly cause ../foo to be truncated, at least).
• One Shell | One shell for all lines in a recipe. | |
• Choosing the Shell | How make chooses the shell used to run recipes. |
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 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Execution.html