2008-11-26 154 views
11

我使用GNU bash,版本3.00.15(1) - 释放(x86_64-redhat-linux-gnu)。并且这个命令:回声“-e”不打印任何东西

echo "-e" 

不打印任何东西。我猜这是因为“-e”是echo命令的有效选项之一,因为echo“-n”和echo“-E”(其他两个选项)也会产生空字符串。

问题是如何逃避序列“-e”以得到自然输出(“-e”)。

回答

12

这是一个艰难的一个;)

通常你会使用双破折号告诉命令,它应该停止解释选项,但回声只会输出那些:

$ echo -- -e 
-- -e 

您可以使用-e本身来解决这个问题:

$ echo -e '\055e' 
-e 

而且,正如其他人所指出的,如果你不使用bash的内置echo坚持,你/bin/echo二进制可能是该工具的GNU版本(检查手册页),从而了解POSIXLY_CORRECT环境变量:

$ POSIXLY_CORRECT=1 /bin/echo -e 
-e 
+0

你碰巧知道,为什么`回声-e`做不从Makefiles工作? – 2010-10-17 00:00:06

+2

@dma_k:适合我(tm)。 make(1)不使用您正在使用的$ SHELL内建程序,因此它的行为会有所不同。 – hop 2010-10-18 19:12:42

+0

谢谢,太棒了!的确,在Makefile中设置`SHELL =/bin/bash`解决了这个问题! – 2010-10-22 09:29:53

4

你可以通过做

echo "-e " 

这将是破折号,即空间作弊。

另外,您可以使用更复杂,但更精确:

echo -e \\\\x2De 
5

有可能是一个更好的办法,但这个工程:

printf -- "-e\n" 
+0

在这种情况下,它可以工作,但它并不能解决全局问题。请考虑:printf“--version” – wheleph 2008-11-26 12:25:53

+2

@wheleph你在“-e \ n”之前忽略了“ - ”,这将选项和参数分开,这是最好的,可移植的(跨壳体)答案+1。 – richq 2008-11-26 13:03:14

0

另一种方式:

echo -e' ' 
echo -e " \b-e" 
1

密切注意该手册页:)

SYSV3=1 /usr/bin/echo -e 

作品,在Solaris上至少

1

另一种替代方法:

echo x-e | sed 's/^x//' 

这是由autoconf manual建议的方式:

[...],通常可以使用以避免这个问题“回响“× $ word“',稍后在管道中考虑'x'。

14

打印任意字符串的唯一正确的方法:

printf "%s" "$vars" 
1

我喜欢一个使用herestring:

cat <<<"-e"