最近碰到一個神奇的問題,同樣的"echo -e"寫在Makefile裡,執行在不同的Linux環境時(分別執行在Rhel4和Ubuntu18.04),顯示結果竟然不一樣?

先簡單前提一下,“echo -e”會處理後面字串中的特殊字元。舉例如下:

echo-e.png

很明顯的,在沒有使用-e參數下,\t被當作一般字元印出來。使用-e參數後,則印出一個tab的空格。

 

那麼在Makefile中我也寫上同樣的指令,神奇的是,執行Makefile的時候,輸出結果跟我想的不一樣啊~

在Rhel4中,輸出結果一切正常;但在Ubuntu18.04中,執行“echo -e”則會把"-e "也一起印出來。

但在Ubuntu的terminal直接"echo -e"卻又不會把"-e "印出來!

這真是太神奇啦~~

echo_test.png

 

仔細研究以後發現,原來是shell的問題啦~

makefile默認使用的shell為/bin/sh,用指令"$ls -l /bin/sh"可以查出/bin/sh 連結到的是dash

而terminal中默認使用的shell,用指令"$echo $SHELL"可以查出來,沒有改動過的話通常會是bash

另外,要查目前terminal中使用的shell,則可以用指令"$echo $0"來查。

echo_bash_dash.png

 

知道問題在哪後,就要來找解法啦~

解法也不難,因為makefile中也有一個"$SHELL"的變數,跟系統的"$SHELL"變數互不干擾。

所以如果只有單一個makefile要使用bash的話,只要在makefile前面寫上"SHELL=/bin/bash"就可以完美執行囉~

echo_solution.png

改完以後的成果

echo_result.png

 

arrow
arrow

    幽濟 發表在 痞客邦 留言(1) 人氣()