打印特殊字符时Bash卡住了

时间:2011-08-03 21:53:57

标签: terminal growl iterm

我的.profile中有这个功能,它使用iTerm2创建一个咆哮通知:

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

但是,如果我declare -f growl,Bash将会卡住,你唯一的选择就是关闭当前的终端窗口。

iTerm2 +中的输出被卡住了:

growl () 
{ 
    echo -n -e '

终端+铃声输出:

growl () 
{ 
    echo -n -e '

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

2 个答案:

答案 0 :(得分:2)

你可能知道,

declare -f growl正在打印函数的完整定义,包括控制字符。

我建议更改定义,以便打印您想要的字符,而不必将它们字面上包含在函数定义中。 Bash的echo命令采用-e选项,使其能够识别转义序列,例如\a的转号序列。 info bash并搜索“echo”以获取更多信息。

(如果您在弄乱终端模拟器时询问如何恢复,我没有答案。)

编辑:我误解了这个问题。问题是您正在使用$'...'语法,它将转义序列扩展为实际控制字符。显然declare -f正在打印扩展的字符串。只是不要使用$'...'语法。

function growl()
{
    echo -n -e '\e]9;'"$@"'\a'
}

'\a'相当于'\007'。)

EDIT2:修正了拼写错误

EDIT3:显然在某些版本的bash中,echo -n -e '\e'不会打印转义字符,但“\ 033”确实有效。修订后的解决方案:

function growl()
{
    echo -n -e '\033]9;'"$@"'\a'
}

(提问者正在使用bash 3.2.48。我已经确认3.2.25这样做是正确的。这很奇怪。)

答案 1 :(得分:1)

最终解决方案:

将其包裹在单引号内并使用eval:

function growl()
{
    eval 'echo -e -n $'"'"'\e]9;'"'"'"$@"'"'"'\007'"'"';'
}