2016-09-16 36 views
0

我努力做到以下幾點:「回聲-e」蘇-c命令不工作

su username -c "echo -e "test 1"" 

當我這樣做,它輸出:

-e test 

如果我試試這個:

su username -c "echo -e 'test 1'" 

輸出:

-e test 1 

嘗試這樣:

su username -c 'echo -e "test 1"' 

輸出:

-e test 1 

我怎樣才能得到這個工作,所以它輸出字符串沒有-e逃生標誌?

+0

'echo -e'實際上並不是合法*。如同在中,提供這一切的'echo'實現違反了POSIX規範。 –

+0

請參閱http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html - 是的,bash違反了規範,但如果同時設置了「posix」和「xpg_echo」標誌它符合,所以你編寫的代碼依賴於'echo -e'是脆弱的。 –

+0

適合我... – arkascha

回答

2

首先,您的報價不是按照您希望的方式嵌套。爲了解決這個問題可能是:

su username -c 'echo -e "test 1"' 

......或者......

su username -c "echo -e \"test 1\"" 

如果要保證孩子外殼是bash的(這在你默認希望的方式支持echo -e ),考慮:

su username -c 'bash -s' <<'EOF' 
echo -e "test 1" 
EOF 

其次,沒有保證echo將在所有處提供-e選項(在符合the relevant standard的回聲上,echo -e將在其輸出上打印-e),因此您的代碼不應該依賴於可用的參數。

的POSIX相當於bash的echo -e(啓用時,它並不總是)是printf '%b'

su username -c "printf '%b\n' 'test 1'" 

...如果你不真正想要的-e行爲(內反斜槓逃逸在內容中,而不是在格式字符串中),請使用%s而不是%b

+0

使用'%b'和一個文字字符串有什麼區別,而不是隻寫字符串? –

+0

@TomFenech,'echo -e「test 1」'根本不包含任何反斜槓轉義,所以由於OP聲稱實際上需要'-e',所以他們的真實代碼/情況可能更有趣。如果他們在變量中含有字面轉義的內容,並且他們想要打印該變量並評估這些轉義,則不希望變量中的任何'%'被視爲替代佔位符,因此'%b'(表示反斜槓,但不是'%'擴展佔位符)。 –

+0

由於'-e'標誌簡單地打開了POSIX'echo'已經有的行爲,所以'echo'是與'bash'''echo -e'相當的POSIX'會更準確。使用'printf'只是避免擔心你擁有哪個'echo'的一種方式。 – chepner