1

我的 .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
4

2 回答 2

2

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

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

(如果你问一旦你的终端模拟器搞砸了如何恢复,我没有答案。)

编辑:我误读了这个问题。问题是您使用的$'...'语法将转义序列扩展为实际的控制字符。显然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 正确地做到了这一点。这很奇怪。)

于 2011-08-03T22:04:31.607 回答
1

最终解决方案:

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

function growl()
{
    eval 'echo -e -n $'"'"'\e]9;'"'"'"$@"'"'"'\007'"'"';'
}
于 2011-08-04T03:32:04.217 回答