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で正常に動作することを確認しております。おかしいです。)