"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

おすすめ記事