我无法理解此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)
。
答案 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 ...