我的.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
答案 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'"'"';'
}