带有-e标志的echo的奇怪行为传递给带有-c标志的bash

时间:2018-06-29 12:02:10

标签: bash

我无法理解此bash脚本的行为(我从较长的实际用例中删除了它):

# This is test.sh
cmd="echo -e \"\n\n\n\t===== Hello World =====\n\n\""
sh -c "$cmd"

它显示的是:

$ ./test.sh
-e


    ===== Hello World =====
$

如果我删除了-e标志,则所有内容都会正确打印,并正确解释带引号的字符,并且不会损坏'-e':但这不应该是那样。

在macOS下,我的bash为GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)

3 个答案:

答案 0 :(得分:2)

在Posix模式下(以sh运行时),bash 3.2的echo命令不带任何选项。 -e只是写入标准输出的另一个参数。比较:

$ bash -c 'echo -e "a\tb"'
a   b
$ sh -c 'echo -e "a\tb"'
-e a    b

在两种情况下都将打印文字标签,因为Posix echo的行为与bash echo -e相同。

因此,printf总是比echo更好地用于提供一致的行为。

cmd='printf "\n\n\n\t===== Hello World =====\n\n"'
sh -c "$cmd"

答案 1 :(得分:0)

sh-4.2#cat test.sh cmd =“ echo -e \” \ n \ n \ n \ t ===== Hello World ====== \ n \ n \“” sh -c“ $ cmd”

sh-4.2#./test.sh

===== Hello World =====

sh-4.2#

它在我的机器上正确打印

答案 2 :(得分:0)

好的,我想我自己是从here找到的:

sh,Bourne外壳,很旧。它的行为由POSIX标准指定。如果您想要新的行为,可以使用bash,即Bourne Again shell,它会一直添加新功能。在许多系统上,sh只是bash,而bash以该名称运行时会打开兼容模式。

Groan ...