![](/img/trans.png)
[英]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.