2017-03-08 53 views
0

我有一個makefile,其中一個操作要求我將一個字符串\noslide寫入名爲modeset.txt的文本文件,所以我使用'echo'。雖然-E標誌應該禁用反斜槓轉義的解釋回聲處理該標誌作爲sting的一部分(請參閱下面的輸出)。沒有解釋換行符的回聲

這裏是我的makefile一個剝離下來的片段:

.PHONY: target all 

all: target 

target: 
    echo -E "\noslide" > modeset.txt 
clean: 
    rm -f modeset.txt 

的呼應吞併了-E作爲字符串的一部分modeset.txt文件顯示的內容。

-E 
oslide 

然而,在shell中,echo -e和echo -E按預期工作,所以makefile環境在做什麼導致這種情況?

操作系統:只從官方消息來源的香草Debian 8。

+0

這是因爲在某些系統(包括Debian的),默認的shell是'/斌/ sh'實現'echo'而不支持'-E'。解決方法是指定'SHELL =/bin/bash'或明確使用'/ bin/echo'(可能定義'ECHO =/bin/echo') –

+0

這可能適用於所有使用GNU coreutils進行回顯的Linux系統,但其他系統(BSD等)上的'/ bin/echo'行爲也可能不同。 – MadScientist

+0

@MadScientist沒錯,'/ bin/echo'的行爲可能因系統而異,甚至GNU coreutils'/ bin/echo'的特定版本可能會根據環境變量'POSIXLY_CORRECT'的設置改變其行爲。也就是說,OP的問題的答案是有回聲,回聲和回聲:一個shell(在'SHELL'變量中指定 - 默認爲'/ bin/sh')內建,如果它存在或者PATH中的命令'(希望'/ bin/echo',但這可能取決於'PATH'中的目錄順序,如果有其他'echo'命令的話)。 –

回答

1

echo不是便攜式的,超出了簡單的文字。存在許多不同的版本,其行爲有所不同,即使在同一個系統中,也可能取決於您使用的外殼(即外殼的內置echo與系統的/bin/echo)。

如果你想要顯示簡單的文本跟着一個換行符其他任何東西,你應該使用printf沒有echo

target: 
     printf '\\noslide\n' > modeset.txt