2017-03-08 45 views
0

我有一个makefile,其中一个操作要求我将一个字符串\noslide写入名为modeset.txt的文本文件,所以我使用'echo'。虽然-E标志应该禁用反斜杠转义的解释回声处理该标志作为sting的一部分(请参阅下面的输出)。没有解释换行符的回声

这里是我的makefile一个剥离下来的片段:

.PHONY: target all 

all: target 

target: 
    echo -E "\noslide" > modeset.txt 
clean: 
    rm -f modeset.txt 

的呼应吞并了-E作为字符串的一部分modeset.txt文件显示的内容。

-E 
oslide 

然而,在shell中,echo -e和echo -E按预期工作,所以makefile环境在做什么导致这种情况?

操作系统:只从官方消息来源的香草Debian 8。

+0

这是因为在某些系统(包括Debian的),默认的shell是'/斌/ sh'实现'echo'而不支持'-E'。解决方法是指定'SHELL =/bin/bash'或明确使用'/ bin/echo'(可能定义'ECHO =/bin/echo') –

+0

这可能适用于所有使用GNU coreutils进行回显的Linux系统,但其他系统(BSD等)上的'/ bin/echo'行为也可能不同。 – MadScientist

+0

@MadScientist没错,'/ bin/echo'的行为可能因系统而异,甚至GNU coreutils'/ bin/echo'的特定版本可能会根据环境变量'POSIXLY_CORRECT'的设置改变其行为。也就是说,OP的问题的答案是有回声,回声和回声:一个shell(在'SHELL'变量中指定 - 默认为'/ bin/sh')内建,如果它存在或者PATH中的命令'(希望'/ bin/echo',但这可能取决于'PATH'中的目录顺序,如果有其他'echo'命令的话)。 –

回答

1

echo不是便携式的,超出了简单的文字。存在许多不同的版本,其行为有所不同,即使在同一个系统中,也可能取决于您使用的外壳(即外壳的内置echo与系统的/bin/echo)。

如果你想要显示简单的文本跟着一个换行符其他任何东西,你应该使用printf没有echo

target: 
     printf '\\noslide\n' > modeset.txt