The shell
function is unlike any other function other than the wildcard
function (see The Function wildcard
) in that it communicates with the world outside of make
.
The shell
function performs the same function that backquotes (‘`’) perform in most shells: it does command expansion. This means that it takes as an argument a shell command and evaluates to the output of the command. The only processing make
does on the result is to convert each newline (or carriage-return / newline pair) to a single space. If there is a trailing (carriage-return and) newline it will simply be removed.
The commands run by calls to the shell
function are run when the function calls are expanded (see How make
Reads a Makefile). Because this function involves spawning a new shell, you should carefully consider the performance implications of using the shell
function within recursively expanded variables vs. simply expanded variables (see The Two Flavors of Variables).
After the shell
function or ‘!=’ assignment operator is used, its exit status is placed in the .SHELLSTATUS
variable.
Here are some examples of the use of the shell
function:
contents := $(shell cat foo)
sets contents
to the contents of the file foo, with a space (rather than a newline) separating each line.
files := $(shell echo *.c)
sets files
to the expansion of ‘*.c’. Unless make
is using a very strange shell, this has the same result as ‘$(wildcard *.c)’ (as long as at least one ‘.c’ file exists).
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/Shell-Function.html