Terminal 打印特殊字符时Bash卡住
我的.profile中有这个函数,它使用iTerm2创建咆哮通知: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
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。好奇者和好奇者。