使用命令`echo -ne" hello \ n"`进行Bash vs. Dash行为

时间:2015-11-18 16:08:59

标签: bash dash-shell

我使用bash和dash使用相同的命令echo -ne "hello\n"获得了不同的行为。见下文:

$ bash -c 'echo -ne "hello\n"'
hello
$ dash -c 'echo -ne "hello\n"'
-ne hello

为什么?我根本不懂...

我的系统:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.5 LTS
Release:    12.04
Codename:   precise

2 个答案:

答案 0 :(得分:8)

echo的POSIX规范不支持任何参数。见here

虽然规范提到-n,但它确实是不是一个选项,并且是一个实现定义的案例或被视为字符串。

所以dash正是这样做的。

另一方面,

bash在许多方面都存在不合规行为。

这就是为什么通常不鼓励使用echo来支持使用printf,因为它具有更好的规范和更好的可移植行为。

答案 1 :(得分:2)

虽然echo中的bash实现不是默认的POSIX和Unix,但您可以在运行时或编译时更改其行为。

在运行时,使用xpg_echo并且在POSIX模式下,bash echo变得一致:

$ env BASHOPTS=xpg_echo SHELLOPTS=posix bash -c 'echo -ne "hello\n"'
-ne hello

或:

$ env BASHOPTS=xpg_echo POSIXLY_CORRECT= bash -c 'echo -ne "hello\n"'
-ne hello

在编译时,您可以将--enable-xpg-echo-default--enable-strict-posix-default个选项传递给configure脚本。