带有转义制表符 ('\t') 字符的 bash 命令在生成文件中失败



在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'

相关内容

  • 没有找到相关文章

最新更新