【问题标题】:echo -e option in ubuntu doesn't workubuntu 中的 echo -e 选项不起作用
【发布时间】:2012-12-18 11:17:03
【问题描述】:

我的同事用的是Ubuntu,我用的是openSUSE,我们用同样的makefile编译了同样的源代码,我的环境运行良好,但是我的同事不行,总是输出无法识别的-e选项。我们检查makefile,只发现echo命令使用-e选项。

Dose Ubuntu 的 echo 功能和其他的不一样?

+++++更新 在makefile中,echo定义为:

TOOLSDIR =

ECHO = $(TOOLSDIR)echo -e

$(TOOLSDIR)是工具的目录,这个make文件可以检测编译环境,如果linux或者有CYGWIN:

$(TOOLSDIR)为空,如果是windows,会转到WIN32版本的echo工具目录,如:

TOOLSDIR = $(subst /,\,$(MAKEDIR)/tools/WIN32/)

我们执行make后,ubuntu会输出:

致命错误:L3900U:无法识别的选项“-e”。

然而,openSUSE 没有这个错误

+++++为 echo -e 更新

我在ubuntu中写了一个测试makefile

all:
    echo -e hello

输出:

echo -e hello

你好

+++++更新 openSUE (12.1) 和 ubuntu (12.04) 中的 makefile 测试

all:
    echo -e "hello 1"
    echo -e hello 2
    echo -e he\nllo3
    echo -e "he\nllo4"
  1. opensuse,输出为:

echo -e "你好 1"

你好 1

echo -e hello 2

你好 2

echo -e he\nllo3

henllo3

echo -e "he\nllo4"

他

llo4

  1. 在 ubuntu 中,输出为:

echo -e "你好 1"

-e 你好 1

echo -e hello 2

你好 2

echo -e he\nllo3

henllo3

echo -e "he\nllo4"

-他

llo4

同时,我在ubuntu中测试,没有-e的回显,结果和openSUSE一样,回显-e

【问题讨论】:

  • 你能粘贴上下文的确切错误吗? echo在ubuntu中支持-e,肯定是别的东西。
  • 你们都使用同一个shell解释器吗?重击/嘘?
  • 请尝试最小的 makefile:all:<cr><tab>echo -e hello 并告诉我们结果。
  • @Diego Basch,我为你更新了我的错误上下文
  • @Beta,我为你发布了我的测试生成文件

标签: shell ubuntu makefile


【解决方案1】:

这可能取决于你们使用的外壳(回声通常在外壳内实现)

这就是在 OS X(Mountain Lion)中发生的事情:

$ bash
bash-4.2$ echo -e foo
foo
bash-4.2$ sh
sh-3.2$ echo -e foo
-e foo

OpenSUSE 和 Ubuntu 也是如此。

-e 选项不符合 POSIX(我不确定,但它应该是默认行为),顺便说一句,要打印格式化文本,printf 是更合适的命令。

根据您提供的信息,我认为您的 makefile 存在错误(可移植性问题)。

在 OSX 上 man echo 也没有列出 -e 选项,顺便说一句。在 Ubuntu 12.10 上,-e 存在于我的计算机上,在我的路由器 BusyBox v1.13.4 上也接受 -e(它是 busybox 的内部命令)

但可能只是 /bin/sh 使用内部命令并忽略它。

==== 更新:

在你的 makefile 中删除 echo 前面的 $(TOOLSDIR):

ECHO = echo -e

事实上,如果你指定了 echo 的路径(即/bin/echo),你会强制 shell 从文件系统执行程序,而不是 shell 内部实现的程序:

$ echo -e foo
foo
$ /bin/echo -e foo
-e foo

【讨论】:

  • 我的同事和我使用 bash 而不是 sh
  • 另外,我更正了我的问题,TOOLSDIR 在 linux build 中是空的
  • 你可以在 ubuntu 中看到我的测试,并使用-eopensuse 回显
  • 另外,我测试echo -e foo和/bin/echo -e foo,在ubuntu中的输出是一样的12.04
  • 谢谢你的回答,我也在/bin/sh找到了一些东西,请看我的回答
【解决方案2】:

\ 是 shell 中的转义字符,所以 \n 就是一个“n”,所以转义转义符 \\\n。

[sg@Study ~]$ echo -e \\nfoo\\nfoo

foo
foo
[sg@Study ~]$

或使用引号

[sg@Study ~]$ echo -e "\\nfoo\\nfoo"

foo
foo
[sg@Study ~]$ 

【讨论】:

  • 谢谢你的回答,我也在/bin/sh找到了一些东西,请看我的回答
【解决方案3】:

我还发现它可能是由 ubuntu 链接 /bin/sh 到 dash 而不是 bash 引起的。在我使用bash 之后,问题解决了,还有一个与此相关的问题,我问: same shell script has different behaviou on different Linux distribution

【讨论】:

    【解决方案4】:

    Luigi R. Viggiano 和 How Chen 都对问题和解决方案提供了很好的解释。事实上,他们的答案是相辅相成的。

    在 dash 中,echo 命令不接受 -e 标志。然而,在 bash 中,确实如此。

    在 Ubuntu 中,可以考虑使用 update-alternatives 来选择 bash 而不是 dash 作为默认 shell。以下命令可以解决问题(警告,这些命令将适用于系统范围):

    sudo update-alternatives --install /bin/sh sh /bin/bash 0
    sudo update-alternatives --install /bin/sh sh /bin/dash 0
    sudo update-alternatives --set sh /bin/bash
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2013-11-28
      相关资源
      最近更新 更多