考虑命令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下)工作,但显然我现在必须做其他事情......
答案 0 :(得分:3)
这是一个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兼容模式)同意它不应该被设置。
我不知道规范的内容。
更新:一些快速搜索表明$_
在许多方面都是一种打击主义(尽管启动值似乎更具可扩展性)。 $_
也恰好是一个令人难以置信的混淆变量,因为它可以根据上下文做很多不同的事情。