我的makefile中有这个食谱:
fraglen=$(shell sed -r 's/,[^\t]+//g' $< | echo "`cut -f 3`/2" | bc)
macs2 [other arguments] --extsize $(fraglen)
确定fraglen的命令似乎工作正常,因为make将输出:
fraglen=102
但是macs2命令打印为:
macs2 [other arguments] --extsize
然后它失败,错误表明extsize参数需要一个参数。是否分配了fraglen变量的问题,或者我引用它的方式?
答案 0 :(得分:2)
您似乎将变量与shell变量混淆。 make配方中的赋值是分配 shell 变量。不幸的是,在make配方中,每一行都在它自己的子shell中独立执行,因此shell环境变量不会从一行保存到下一行。
您可以将两条线放在一条逻辑行中,这样它们就可以在同一个shell中执行。您还需要更改第二行,以便它引用shell变量而不是make变量:
target: ...
fraglen=$(shell sed -r 's/,[^\t]+//g' $< | echo "`cut -f 3`/2" | bc) \
macs2 [other arguments] --extsize $$fraglen
没有必要使用make的$(shell ...)
构造,因为你可以让shell进行计算(同样,我们将$加倍,以便将它传递给shell)。
target: ...
fraglen=$$(sed -r 's/,[^\t]+//g' $< | echo "`cut -f 3`/2" | bc) \
macs2 [other arguments] --extsize $$fraglen
最后,您可以使用例如awk:
来简化shell表达式target: ...
fraglen=$$(awk -F'\t' '{ sub(/,.*/, "", $$3); print $$3/2 }' $<) \
macs2 [other arguments] --extsize $$fraglen
(awk程序返回输入单行第三个以制表符分隔的字段中第一个逗号分隔值的一半。)awk不会截断为整数,所以如果有可能这个数字很奇怪,你需要使用像printf "%d\n", $$3/2
这样的东西而不是print语句。)