"echo -e '\e]4;40;?\a'" の出力を変数に保存またはパイプするにはどうすればよいですか?

"echo -e '\e]4;40;?\a'" の出力を変数に保存またはパイプするにはどうすればよいですか?

からインスピレーションを受けるこのフォーラムの投稿、Bashプロンプトで次のコマンドを実行しました。

echo -e '\e]4;40;?\a'

任意の出力:

# 4;rgb:8b8b/cdcd/0000

しかし、奇妙なことは、出力が私のプロンプトの上に印刷されるのではなく、私のプロンプトの次のコマンドになるということです。

"4;rgb:8b8b/cdcd/0000" テキストを変数に保存したいのですが、驚くべきことに次の問題が発生します。

output=$(echo -e '\e]4;30;?\a')
echo "$output"

これと同じ:

echo -e '\e]4;30;?\a'   |   awk  -F ":"  ' { print $1 } '

"4;rgb:8b8b/cdcd/0000" 出力を変数に保存またはパイプするにはどうすればよいですか?

助けてくれてありがとう!

編集:返信ありがとうございます!しかし、同じ問題が発生します。

out=`eval "echo -e '\e]4;40;?\a'"`; echo $out

その後、$ out変数の部分文字列を生成しようとしましたが、 "4; rgb"の代わりに空白行が印刷されました。

substring=${out:0:5}; echo "$substring"

私もこれを試しました:

out=`eval "echo -e '\e]4;40;?\a'"`; echo $out |  awk  -F ":"  ' { print $1 } '

awk は "4;rgb" の代わりに空行で応答し、次のコマンドで "4;rgb:8b8b/cdcd/0000" がプロンプトに表示されます。

答え1

取得する文字列は4;rgb:8b8b/cdcd/0000実際にはechoコマンドの出力ではなく、端末エミュレータに送信されたエコー文字列の副作用です。端末エミュレータは、対応する文字を入力したかのように出力して反応します。

シェルはそれを知らないので、空の文字列出力をキャプチャしようとします。

必要なものを達成する1つの方法は次のとおりです。

script -qc "echo -e '\e]4;40;?\a';read foo" /tmp/foo
out=$(tail -1 /tmp/foo)

これのいくつかの説明は次のとおりです。このscriptコマンドは画面に表示されるすべてをキャプチャします。このコマンドは、端末エミュレータが目的の文字列を出力する前にコマンドが完了するのをread foo防ぎます。scriptこのtail -1コマンドは、このコマンドによって生成された不要な行を削除しますscript

答え2

ツールを追加する代わりに、おそらく持っているツールを使用できます(そしてその過程で何かを学ぶことができます)。使いたいなら子犬Linux効果的に、これは良いもの

以下は、シェルのみを使用した簡単な例です。catprintfsttyそしてtty(例では、これらのプログラムによって提供される移植不可能な機能を使用していませんが、GNU CoreUtilsのすべての部分):

#!/bin/sh
# $Id: osc4-demo,v 1.2 2016/04/03 12:50:20 tom Exp $
# A simple demo for retrieving a color using xterm's OSC 4 control

osc4_demo() {
    result=$(
        old=$(stty -g);
        stty raw -echo min 0 time 2;
        printf '\033]4;%d;?\007' "$1" >$(tty);
        cat $(tty);
        stty $old
        )
    echo "asked $1, result: $(echo "$result" | cat -v)"
}

for code in "$@"
do
    osc4_demo $code
done

スクリプトはresult変数を設定し、それを印刷可能な形式で表示します。たとえば、

$ osc4-demo 4 44 144 244
asked 4, result: ^[]4;4;rgb:0000/0000/eeee^G
asked 44, result: ^[]4;44;rgb:0000/d7d7/d7d7^G
asked 144, result: ^[]4;144;rgb:afaf/afaf/8787^G
asked 244, result: ^[]4;244;rgb:8080/8080/8080^G

端末を一時的に raw モードに変更し、改行を終了せずに値を再読み込みできるように動作します。これは本質的にこれらのツールが実行することです。

スクリプトは実際の送受信を実行するため、tty結果をファイルにリダイレクトできます。結果を生成するために使用される-vオプションcat読める(実際の変数は制御文字を制御しますが)

追加することを検討しています

exec < /dev/tty

これを改善するには、他のxtermベースのスクリプト(例を参照)実行の使用内部に高度なバッシュスクリプトガイド)、しかしこれがDebian dashでは役に立たないことがわかりました。

この形式に固執する人にとっては、複数行表現を1行に圧縮することもできますが、一般的に明確さを失います。

追加資料:

答え3

xtermcontrol --get-colorN最初の16色を使用することもできます。残念ながら、完全な256色のパレットをサポートしていません。

答え4

以下を試してくださいevaleval次の情報を見つけることができます)。ここ)

out=`eval "echo -e '\e]4;40;?\a'"`; echo $out

内容は$ outに保存され、含めるときにのみ印刷されます。echo $out

関連情報