在Makefile (gnu make,在Ubuntu系统上)中,我有以下命令:
.PHONY: stack-use
stack-use: $(BUILD_PATH)/$(TARGET).elf
@cat build/*.su | sort -t$$'t' -k2 -nr | awk -F't' '{ if($$2>0) {print $$0}}' | column -s$$'t' -t
运行make -n stack-use
时,我得到
$ make -n stack-use
cat build/*.su | sort -t$'t' -k2 -nr | awk -F't' '{ if($2>0) {print $0}}' | column -s$'t' -t
和运行打印的命令产生我想要的输出。
然而,问题是,当我从make中运行它时,我得到:
sort: multi-character tab ‘$\t’
所以看起来反斜杠字符被转义了,因此shell命令没有"看到"预期的TAB ('t')字符,而是看到一个反斜杠后面跟着一个't'。
我该如何解决这个问题?
更新:根据下面的建议,最终的工作代码是
@cat build/*.su | sort -t"$(printf 't')" -k2 -nr | awk -F't' '{ if($2>0) {print $0}}' | column -s"$(printf 't')" -t
正如注释所指出的,这里没有使用bash。
你可以强制你的makefile使用bash作为它的shell:
SHELL := /bin/bash
或者您可以重写命令以使用符合posix的语法。例如,可以用"-t$$(printf 't')"
代替-t$$'t'
。