考虑命令 make --eval '$(error $(shell echo foo && echo $$_))'
(或 3.82 之前的 make 版本的等效 makefile,其中 eval 选项似乎已添加)。我希望它输出“foo foo”,这就是 Cygwin 下的 gmake 3.82.90 所发生的情况。但 Debian 下的 gmake 3.81 和 4.0 却输出“foo/usr/bin/make”。
有人知道为什么会发生这种情况吗?
当然,在真正的 makefile 中,shell 命令的第一部分比简单的 echo 稍微复杂一些,其想法是仅在命令成功时才输出其参数,否则将其留空以指示失败。对我来说,这似乎比其他替代方案更优雅,并且在初始测试中(在 Cygwin 下)工作,但显然我现在必须做其他事情......
最佳答案
这是一个 shell 问题,而不是 make 问题。不知道为什么我最初没有看到这一点。
Debian
$ /bin/bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
$ /bin/bash -c 'echo foo && echo $_'
foo
foo
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Nov 8 08:49 /bin/sh -> dash
$ /bin/sh -c 'echo foo && echo $_'
foo
/bin/sh
$ /bin/dash -c 'echo foo && echo $_'
foo
/bin/dash
CentOS
$ /bin/bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
$ /bin/bash -c 'echo foo && echo $_'
foo
foo
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 29 10:39 /bin/sh -> bash
$ /bin/sh -c 'echo foo && echo $_'
foo
foo
所以这里的问题是 $_
何时获取其非启动值的问题。看起来 dash 和 bash(在较新版本的 bash 中处于 sh 兼容模式)同意尚不应该设置它。
我不知道规范对此有何说明。
更新:一些快速搜索表明 $_
在很多方面都是 bash-ism(尽管启动值似乎更广泛可移植)。 $_
也恰好是一个令人难以置信的困惑变量,因为它可以根据上下文执行许多不同的操作。
关于shell - 为什么 "$_"没有按 GNU make shell 函数的预期扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27627704/