簡體   English   中英

ubuntu中的echo -e選項不起作用

[英]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"
  1. opensuse,輸出是:

echo -e“你好1”

你好1

echo -e你好2

你好2

echo -e he \\ nllo3

henllo3

echo -e“he \\ nllo4”

llo4

  1. 在ubuntu中,輸出是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM