Terminal 打印特殊字符时Bash卡住

Terminal 打印特殊字符时Bash卡住,terminal,growl,iterm,Terminal,Growl,Iterm,我的.profile中有这个函数,它使用iTerm2创建咆哮通知: function growl() { echo -n -e $'\e]9;'"$@"'\007' } 但是,如果我声明-f咆哮,Bash将被卡住,您唯一的选择就是关闭当前的终端窗口 iTerm2+中的输出受到阻碍: growl () { echo -n -e ' 终端+铃中的输出: growl () { echo -n -e ' 7;file://path/to/current/work/d

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

function growl()
{
    echo -n -e $'\e]9;'"$@"'\007'
}
但是,如果我声明-f咆哮,Bash将被卡住,您唯一的选择就是关闭当前的终端窗口

iTerm2+中的输出受到阻碍:

growl () 
{ 
    echo -n -e '
终端+铃中的输出:

growl () 
{ 
    echo -n -e '

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

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

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

(如果您想问,一旦终端仿真器出现故障,如何恢复,我没有答案。)

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

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

编辑2:固定打字错误

EDIT3:显然在某些版本的bash中,
echo-n-e'\e'
不打印转义字符,但'\033'可以工作。修订的解决方案:

function growl()
{
    echo -n -e '\033]9;'"$@"'\a'
}
(发问者使用的是bash 3.2.48。我已经确认3.2.25做得正确。这很奇怪。)

最终解决方案:

function growl()
{
    echo -n -e '\033]9;'"$@"'\a'
}
将其包装在单引号内并使用eval:

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

什么是\e]9的等价物;无效语法+
echo-n-e$\e]9;'“$@”'\a'
不显示咆哮声notification@Tyilo:对不起,我删除了错误的字符。我只是更新它;再试一次。(顺便说一句,
Growl
显然是MacOS特有的东西,所以我无法实际测试它。)嗯,这很奇怪。当我将您的原始定义复制并粘贴到bash shell中,然后运行
growl | od-c
,得到“033]9;\a”。当我复制并粘贴我自己的(更新的)定义并运行相同的命令时,我会得到相同的输出——之后,
declare-f growl
不会显示任何不可打印的字符。它到底是如何工作的?该函数在ITERM2中不显示咆哮通知,这很奇怪。所有三个解决方案(你的问题中的一个、我的答案中的一个和你的最终解决方案中的一个)都应该是相同的。唯一的区别是
declare-f growl
的行为(我刚刚用bash4.2.8验证了这一点)。你能帮我试试吗?复制并粘贴三个定义中的每一个,然后运行
growlhello | od-c
。每个版本的输出都完全相同。如果你这样做了,我想知道为什么不是所有的版本都适合你;如果你不这么做,就会发生一些奇怪的事情。好了,现在我们有进展了。看起来bash的内置
echo-e
无法识别
'\e'
echo-e-n'\e'| od-c'是否在“e”之后显示反斜杠?它*应该*显示“033”,一个转义字符。echo$BASH_版本显示了什么?如果将我的解决方案中的
\e
更改为“\033”,会发生什么?酷。(您可能会考虑使用PrtTF而不是回音,因为它的行为更稳定;BASH的未来版本可能会破坏您的功能。)BTW,我刚刚在Ubuntu上构建了BASH3.2.48,它正确地处理了<代码> \E。好奇者和好奇者。