ubuntu中的echo -e选项不起作用

时间:2013-01-04 01:49:51

标签: shell ubuntu makefile

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

剂量Ubuntu的回声功能与其他功能不同?

+++++更新 在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

您好

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

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

    你好1

    echo -e hello 2

    你好2

    echo -e he \ nllo3

    henllo3

    echo -e“he \ nllo4”

    llo4

    1. 在ubuntu中,输出为:
    2. echo -e“hello 1”

      -e hello 1

      echo -e hello 2

      你好2

      echo -e he \ nllo3

      henllo3

      echo -e“he \ nllo4”

      -e他

      llo4

      同时,我在ubuntu中测试,没有-e的回声,结果与openSUSE相同,回显为-e

4 个答案:

答案 0 :(得分:6)

它可能取决于你们使用的shell(回声通常在shell中实现)

这是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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

\是shell中的转义字符,因此\n只是一个" n",所以逃避转义\\\n

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

foo
foo
[sg@Study ~]$

或使用引号

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

foo
foo
[sg@Study ~]$