Баш застревает при печати специального символа - PullRequest
1 голос
/ 04 августа 2011

У меня есть эта функция в моем .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 ]

2 голосов
/ 04 августа 2011

declare -f growl, как вы, вероятно, знаете, печатает полное определение функции, включая управляющие символы.

Я предлагаю изменить определение, чтобы оно печатало нужные символы без необходимости их буквального включения в определение функции. Команда Bash echo принимает опцию -e, которая позволяет ему распознавать escape-последовательности, такие как \a для символа звонка. info bash и ищите "echo" для получения дополнительной информации.

(Если вы спрашиваете, как восстановить систему после того, как испортили свой эмулятор терминала, у меня нет ответа.)

РЕДАКТИРОВАТЬ: Я неправильно понял вопрос. Проблема в том, что вы используете синтаксис $'...', который расширяет escape-последовательности до реальных управляющих символов. Видимо declare -f печатает расширенные строки. Только не используйте синтаксис $'...'.

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

('\a' эквивалентно '\007'.)

EDIT2: исправлена ​​опечатка

EDIT3: по-видимому, в некоторых версиях bash echo -n -e '\e' не печатает escape-символ, но '\ 033' работает. Пересмотренное решение:

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

(Спрашивающий использует bash 3.2.48. Я подтвердил, что 3.2.25 делает это правильно. Это странно.)

1 голос
/ 04 августа 2011

Окончательное решение:

Оберните его в одинарные кавычки и используйте eval:

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