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