端末は不要なエスケープシーケンスを自動的に無視しますか?

端末は不要なエスケープシーケンスを自動的に無視しますか?

端末は不要なエスケープシーケンスを自動的に無視しますか?

#!/bin/sh

printf "\033[?25l"
printf "\033[?25l"  # superfluous
printf "\033[31m"
printf "\033[31m"   # superfluous
printf "Red Text\n"
sleep 1
printf "\033[0m"
printf "\033[?25h"

答え1

はい、そうです。

開いたタグと閉じるタグが一致する必要があるHTMLなど、特定の文書形式に精通している可能性があります。たとえば、次は重要ではありません。

<font style="color:red"><font style="color:red">foobar</font></font>

しかし、ラベルのバランスが合っていないので、そうではありません。

<font style="color:red"><font style="color:red">foobar</font>

端末エミュレーションはいいえこのように。端末エミュレータは、「文書」全体を一度に見るのではなく、時間の経過とともに入ってくるストリームを見る。

端末エミュレータはステートマシンです。コンテキストを開いたり閉じたりしないなど、完全なエスケープシーケンスは単に新しい状態を設定し\033[?25lます。\033[31m最初の例ではカーソルが見えなくなり、2番目の例では赤いフォントに切り替えられます。複数回実行でき、カーソルが表示されなくなり、テキストが赤く変わらず、これらのコマンドのインスタンスがスタックのどこかに残りません。これはワンタイム割り当てです。カーソルは表示されず(以前の状態に関係なく)、印刷された後続のテキストの色が赤に変わります(やはり前の状態に関係ありません)。

一種のオープン - クローズの意味を持つエスケープシーケンスはいくつかあります。たとえば、現在のウィンドウタイトルをスタックにプッシュしてそこからポップすることができ、当然ペアとして使用する必要があります。

関連情報