1

.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
4

2 に答える 2

2

declare -f growlおそらくご存知のように、制御文字を含む関数の完全な定義を出力しています。

定義を変更して、必要な文字を関数定義に文字通り含める必要なく出力することをお勧めします。Bash のechoコマンドには、ベル文字 -eなどのエスケープ シーケンスを認識できるようにするオプションがあります。詳細については、「エコー」を検索してください。\ainfo 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で正常に動作することを確認しております。おかしいです。)

于 2011-08-03T22:04:31.607 に答える
1

最終的解決:

一重引用符で囲み、eval を使用します。

function growl()
{
    eval 'echo -e -n $'"'"'\e]9;'"'"'"$@"'"'"'\007'"'"';'
}
于 2011-08-04T03:32:04.217 に答える