我使用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
答案 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
脚本。