[英]shell - temp IFS as newline only. Why doesn't this work: IFS=$(echo -e '\n')
[英]echo -e option in ubuntu doesn't work
我的同事使用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你好
你好
++++更新makefile测试在openSUE( 12.1 )和ubuntu( 12.04 )
all:
echo -e "hello 1"
echo -e hello 2
echo -e he\nllo3
echo -e "he\nllo4"
echo -e“你好1”
你好1
echo -e你好2
你好2
echo -e he \\ nllo3
henllo3
echo -e“he \\ nllo4”
他
llo4
echo -e“你好1”
你好1
echo -e你好2
你好2
echo -e he \\ nllo3
henllo3
echo -e“he \\ nllo4”
- 他
llo4
同时,我在ubuntu中测试,没有-e
echo,结果与openSUSE相同,echo与-e
它可能取决于你们正在使用的shell(echo经常在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
我也发现它可能会导致ubuntu link /bin/sh
dash
而不是bash
。 在我使用bash
,问题解决了,还有一个与此相关的问题,我问: 相同的shell脚本在不同的Linux发行版上有不同的行为
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
\\
是shell中的转义字符,所以\\n
只是一个“n”,所以逃避转义\\\\\\n
。
[sg@Study ~]$ echo -e \\nfoo\\nfoo
foo
foo
[sg@Study ~]$
或使用报价
[sg@Study ~]$ echo -e "\\nfoo\\nfoo"
foo
foo
[sg@Study ~]$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.