2011-08-03 81 views
1

我在我的.profile,它可以創建iTerm2咆哮通知有此功能:擊卡住打印特殊字符

function growl() 
{ 
    echo -n -e $'\e]9;'"[email protected]"'\007' 
} 

但是,如果我做declare -f growl,bash將成爲卡住,你唯一的選擇是關閉當前的終端窗口。

產出iTerm2 +被卡住:

growl() 
{ 
    echo -n -e ' 

輸出在終端+鍾:

growl() 
{ 
    echo -n -e ' 

7;file://path/to/current/work/dir 

回答

2

declare -f growl,你可能知道,在打印功能的完整定義,包括控制字符。

我建議改變定義,以便打印出你想要的字符,而不必將它們從字面上包含在函數定義中。 Bash的echo命令採用-e選項,該選項使其能夠識別轉義序列,如響鈴字符的\ainfo bash並搜索「回聲」以獲取更多信息。

(如果你問如何恢復,一旦你搞砸了你的終端模擬器,我沒有答案。)

編輯:我誤解了問題。問題是您正在使用$'...'語法,該語法將轉義序列擴展爲實際控制字符。顯然declare -f正在打印擴展的字符串。只是不要使用$'...'語法。

function growl() 
{ 
    echo -n -e '\e]9;'"[email protected]"'\a' 
} 

'\a'相當於'\007'

EDIT2:固定錯字

EDIT3:顯然在bash的某些版本中,echo -n -e '\e'不打印轉義字符,但 '\ 033'確實有效。修訂方案:

function growl() 
{ 
    echo -n -e '\033]9;'"[email protected]"'\a' 
} 

(提問者正在使用bash 3.2.48我已經證實了3.2.25正確地做到這一點很奇怪。)

+0

什麼是\ e的等價物9; – Tyilo

+0

無效語法+'echo -n -e $ \ e] 9;'「$ @」'a''不顯示咆哮通知 – Tyilo

+0

@Tyilo:對不起,我刪除了錯誤的字符。我只是更新它;再試一次。 (順便說一句,'咆哮'顯然是MacOS特有的東西,所以我實際上不能測試它。) –

1

最終的解決方案:

裏面把它包單引號和使用評估:

function growl() 
{ 
    eval 'echo -e -n $'"'"'\e]9;'"'"'"[email protected]"'"'"'\007'"'"';' 
} 
+0

這很奇怪。所有三種解決方案(您的問題中的一個,我的答案中的一個和最終解決方案中的一個)*應該*具有相同的功能。唯一的區別是'declare -f growl'的行爲(我剛剛用bash 4.2.8驗證了這一點)。你能爲我做點什麼嗎?複製並粘貼三個定義中的每一個,然後運行'growl hello | od -c'。每個版本的輸出都完全相同。如果你這樣做,我想知道爲什麼不是所有的版本都適合你。如果你不這樣做,還有其他奇怪的事情正在發生。 –

+0

結果:http://cl.ly/91jz – Tyilo

+0

同樣的結果在終端:http://cl.ly/91P9 – Tyilo