5

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

Dose Ubuntu 的 echo 功能和其他的有什么不同?

+++++在makefile中更新,回显定义为:

TOOLSDIR =

ECHO = $(TOOLSDIR)echo -e

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

$(TOOLSDIR)为空,如果是windows,则进入WIN32版本回显工具目录,如:

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

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

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

但是,openSUSE 没有这个错误

+++++更新回声-e

我在ubuntu中写了一个测试makefile

all:
    echo -e hello

它输出:

回声 -e 你好

你好

+++++更新 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. 打开使用,输出为:

回声-e“你好1”

你好 1

回声 -e 你好 2

你好 2

echo -e he\nllo3

henllo3

echo -e "他\nllo4"

llo4

  1. 在 ubuntu 中,输出为:

回声-e“你好1”

-e 你好 1

回声 -e 你好 2

你好 2

echo -e he\nllo3

henllo3

echo -e "他\nllo4"

-e他

llo4

同时,我在ubuntu中测试,echo without -e,结果和openSUSE一样,echo with-e

4

4 回答 4

7

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

这就是 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 存在错误(可移植性问题)。

顺便说一句,在 OSXman 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
于 2013-01-04T02:05:59.567 回答
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
于 2014-10-14T19:36:27.900 回答
1

我还发现它可能是由 ubuntu 链接/bin/shdashbut NOT引起的bash。使用后bash,问题解决了,还有一个与此相关的问题,我问: 相同的 shell 脚本在不同的 Linux 发行版上有不同的行为

于 2013-08-07T05:08:44.383 回答
-1

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

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

foo
foo
[sg@Study ~]$

或使用引号

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

foo
foo
[sg@Study ~]$ 
于 2013-08-06T18:03:02.573 回答