8

我的印象是我可以在 GNU makefile 中调用 bash 函数,但似乎是错误的。这是一个简单的测试,我定义了这个函数:

>type lsc
lsc is a function
lsc () 
{ 
    ls --color=auto --color=tty
}

这是我的Makefile:

>cat Makefile
all:
    lsc

这是我在运行 make 时得到的:

>make
lsc
make: lsc: Command not found
make: *** [all] Error 127

我的印象有错吗?还是有任何环境设置问题?我可以在命令行运行“lsc”。

4

6 回答 6

9

$*在 BASH 脚本中使用:

函数.sh

_my_function() {
  echo $1
}

# Allows to call a function based on arguments passed to the script
$*

生成文件

test:
    ./functions.sh _my_function "hello!"

运行示例:

$ make test
./functions.sh _my_function "hello!"
hello!
于 2016-10-07T09:58:14.697 回答
7

您不能在 Makefile 中调用 bash 函数或别名,只能调用二进制文件和脚本。但是,您可以做的是调用交互式 bash 并指示它调用您的函数或别名:

all:
    bash -i -c lsc

例如,如果lsc在您的 中定义.bashrc

于 2012-10-29T23:04:00.160 回答
2

您是否使用“export -f”导出了您的函数?

bash 是 Makefile 的外壳,还是 sh?

于 2012-10-29T00:41:35.227 回答
1

如果您从问题How do I write the 'cd' command in a makefile?

.ONESHELL: my_target

my_target: dependency
    . ./shell_script.sh
    my_imported_shell_function "String Parameter"

如果你愿意,你甚至可以不使用这个东西,只在导入 shell 脚本后.ONESHELL使用冒号在一行中完成所有操作:;

my_target: dependency
    . ./shell_script.sh; my_imported_shell_function "String Parameter"
于 2018-03-04T01:57:10.993 回答
0

这个问题并不是make. Make 在 shell 的上下文中执行命令,如果函数可用,shell 可以执行函数。

问题是当你启动一个新的 shell(或 shell 脚本,或 make 命令)时,Bash 不会自动转发来自调用环境的所有函数

明确指定 shell 应该/bin/bash确保 make 不会调用不同的 shell 解释器,这可能会影响函数处理。 有几种方法可以做到这一点。 在下面的示例中,我使用了特定于目标的方法。

例如,下面的 makefile 片段调用它被实现为 bash 函数的集合nvm

警告:使用先前定义的函数意味着 makefile 取决于您的 shell 环境的(可能不受控制的)状态,因此应该明智地使用这种类型的解决方案。


方法 1:运行“交互式”shell

在此示例中,假定函数被定义为用户的 .bashrc 文件的一部分。在交互模式下运行 Bash(带有-i)会导致 .bashrc 被处理到命令环境中。

mytarget1: SHELL:=/bin/bash -i
mytarget1:
    nvm install 14 && npm version

方法二:按需导入函数

这种方法显式地获取定义感兴趣函数的脚本。

mytarget2:
    . ~/.nvm/nvm.sh && nvm install 14 && npm version

为此,您可能更喜欢: makefile 中的多行 bash 命令


方法三:运行makefile前导出函数

调用makeexport -f nvm ; make mytarget3将函数导出到任何子命令。

mytarget3: SHELL:=/bin/bash
mytarget3:
    nvm install 14 && npm version

注意:此示例无法完全运行,因为nvm在内部,它依赖于大量子函数,这些子函数也需要导出。

于 2021-09-07T07:46:49.833 回答
0

假设 compile 是你 .bash_profile 中的一个函数

.bash_profile

compile(){
  ...
}

生成文件

ACTIVE_ENV=source ~/.bash_profile 
default:
    $(ACTIVE_ENV) && compile boot_sect_simple.asm c
于 2020-08-03T09:11:26.890 回答