shell - 为什么 "$_"没有按 GNU make shell 函数的预期扩展?

标签 shell gnu-make

考虑命令 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/

相关文章:

linux - 使用 sh 脚本跳过密码提示

php - 如何编写命令行交互式 PHP 脚本?

c++ - Makefile 改进,依赖生成不起作用

linux - <命令行> :1:1: error: macro names must be identifiers

c - #ifdef 和使用 Makefile 的条件编译

R make install 失败,文件丢失

makefile - Makefile 目标依赖项中的变量替换

免费的 php() : error: chunk is already free

mysql - 使用Shell脚本远程拉取Mysql数据

linux - 用换行符替换空格,特殊字符包裹的空格除外