Bash 你能用GNU';什么牌子?

Bash 你能用GNU';什么牌子?,bash,makefile,gnu-make,Bash,Makefile,Gnu Make,我想在make文件中的每个shell命令上注入一个透明包装命令。类似于timeshell命令。(但是,不是time命令。这是一个完全不同的命令。) 有没有一种方法可以为gmake将发出的每个shell命令指定某种包装器?我认为没有一种方法可以在GNUMake本身中实现您想要的功能 我做了一些事情,比如修改Makefile中的PATH env变量,以便执行一个目录,其中我的脚本链接到我想要包装的所有容器名称,而不是实际的容器名称。然后,脚本将查看如何调用它,并使用wrapped命令执行实际的bin

我想在make文件中的每个shell命令上注入一个透明包装命令。类似于
time
shell命令。(但是,不是
time
命令。这是一个完全不同的命令。)

有没有一种方法可以为gmake将发出的每个shell命令指定某种包装器?

我认为没有一种方法可以在GNUMake本身中实现您想要的功能

我做了一些事情,比如修改Makefile中的PATH env变量,以便执行一个目录,其中我的脚本链接到我想要包装的所有容器名称,而不是实际的容器名称。然后,脚本将查看如何调用它,并使用wrapped命令执行实际的bin

即执行时间“$0”“$@”

这些天我通常只更新Makefile本身中的目标。与管理链接目录相比,将所有修改保留在一个文件中通常更好

更新


我听从吉尔的回答。这是一个比我更好的答案。

GNU
make(1)
用于运行命令的程序由
SHELL
make变量指定。它将按以下方式运行每个命令:

$SHELL -c <command>

这将导致在每个命令前面运行
time
。您需要
eval
,因为
$2
通常不是一个命令,可以包含需要扩展或处理的各种shell元字符。

类。您可以告诉make使用不同的shell

SHELL = myshell
其中,
myshell
是一个类似于

#!/bin/sh
time /bin/sh "$0" "$@"
但是,通常的方法是在所有命令调用之前添加一个变量。虽然我看不到
SHELL
方法的任何显示停止符,但前缀方法的优点是它更灵活(可以为不同的命令指定不同的前缀,并在命令行上覆盖前缀值),而且速度明显更快

# Set Q=@ to not display command names
TIME = time
foo:
    $(Q)$(TIME) foo_compiler
下面是一个完整的外壳包装器工作示例:

#!/bin/bash

RESULTZ=/home/rbroger1/repos/knl/results
if [  "$1" == "-c" ] ; then
    shift
fi

strace -f -o `mktemp $RESULTZ/result_XXXXXXX` -e trace=open,stat64,execve,exit_group,chdir /bin/sh -c "$@"  | awk '{if (match("Process PID=\d+ runs in (64|32) bit",$0) == 0) {print $0}}'

# EOF

当然,在每个命令中应用包装器。我真的不认为你可以用一个手势来包装所有的命令。你可以用你自己的外壳来包装(每行)。Per命令比较复杂,因为行是由shell解析的,而不是由make解析的。啊,这就是实现的方法,jdigital。Bash提供了一种重新转义命令--
“$@”
的方法。我只需要做一些像
my_cmd“$@”
#!/bin/bash

RESULTZ=/home/rbroger1/repos/knl/results
if [  "$1" == "-c" ] ; then
    shift
fi

strace -f -o `mktemp $RESULTZ/result_XXXXXXX` -e trace=open,stat64,execve,exit_group,chdir /bin/sh -c "$@"  | awk '{if (match("Process PID=\d+ runs in (64|32) bit",$0) == 0) {print $0}}'

# EOF