web-dev-qa-db-ja.com

シェルスクリプトでテキストを点滅させる方法

私はこのコードを以下に持っています:

echo " \033[33mTitle of the Program\033[0m"

色が黄色に変わります。

「プログラムのタイトル」というテキストを点滅させるにはどうすればよいですか?

15
user2519862

それなしでは機能しない場合は、-eを追加してみてください

-eオプションをechoに追加する必要がある場合があります(少なくとも、使用するすべてまたはほとんどのシステムで必要です)。以下は、テキストを点滅させるようシステムに指示します。

echo  -e "\033[5mTitle of the Program\033[0m"

点滅することができますand color

そして、either黄色または点滅を選択する必要はありません。ケーキを食べて食べることもできます:

echo  -e "\033[33;5mTitle of the Program\033[0m"

一部のシステムは点滅コードを無視します

システムは点滅コードを無視する場合がありますが、これは非常に一般的です。テキストを目立たせたいが、点滅を無視する場合は、代わりに7で色を反転できます。

echo  -e "\033[33;7mTitle of the Program\033[0m"

または、点滅and色の反転(および黄色)を使用できます。

echo  -e "\033[33;5;7mTitle of the Program\033[0m"
21
iconoclast

blinkを機能させるかどうかは、terminal emulatorに依存します。 system自体は無関係です。

質問で与えられた例は近かったので、エスケープシーケンスを変更するだけで POSIX Shell

echo  "\033[33;5mTitle of the Program\033[0m"

-eは不要であることが示唆されています(bashism、非標準であり、通常は不要です)。 7(逆)から5(点滅)は、求められたことを実行します。

エスケープをハードコーディングする代わりに、 tput を使用できます。たとえば、

printf '%s%s%s%s' "$(tput setaf 3)" "$(tput blink)" "Title of the Program" "$(tput sgr0)"

同じ効果のために、2つの違いがあります。

  • 式は間違いなく読みやすく、
  • 実際には既知の端末機能を使用しますが、
  • 適切な端末の説明、つまり$TERM

例えば、VTE(さまざまな skins に使用されるライブラリ(gnomeなど) -terminal)はまばたきをサポートしていません(また、さまざまなバグレポートでトピックに関する開発者の意見を見つけることができます)。 infocmp を使用して、対応する端末機能を表示すると、それに加えていくつかの違いが示されます。

$ infocmp vte xterm
comparing vte to xterm.
    comparing booleans.
        km: F:T.
        mc5i: F:T.
        npc: F:T.
    comparing numbers.
    comparing strings.
        blink: NULL, '\E[5m'.
        cnorm: '\E[?25h', '\E[?12l\E[?25h'.
        cvvis: NULL, '\E[?12;25h'.
        enacs: '\E)0', NULL.
        is2: '\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8', '\E[!p\E[?3;4l\E[4l\E>'.
        kb2: '\E[E', '\EOE'.
        kfnd: '\E[1~', NULL.
        kslt: '\E[4~', NULL.
        mc0: NULL, '\E[i'.
        mc4: NULL, '\E[4i'.
        mc5: NULL, '\E[5i'.
        rep: NULL, '%p1%c\E[%p2%{1}%-%db'.
        rmacs: '^O', '\E(B'.
        rmcup: '\E[2J\E[?47l\E8', '\E[?1049l'.
        rmm: NULL, '\E[?1034l'.
        rs2: '\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h', '\E[!p\E[?3;4l\E[4l\E>'.
        setb: NULL, '\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m'.
        setf: NULL, '\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m'.
        sgr: '\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;', '%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m'.
        sgr0: '\E[0m\017', '\E(B\E[m'.
        smacs: '^N', '\E(0'.
        smcup: '\E7\E[?47h', '\E[?1049h'.
        smm: NULL, '\E[?1034h'.

たまたまKDE konsoleを使用している場合、違いはより長くなります(ただし、konsoleblinkをサポートします)。

4
Thomas Dickey

Bashスクリプトで行を点滅させる小さな回避策

for (( i=0;i<=3;i++))
do
#Below line will deleted the before printed line
echo -en "\033[1A"
echo -en "EmpNo:$empno already exists\n";
sleep 0.4s;
#Below line to print a blank line
echo -en "\033[1A"
echo -en "                                                            \n";                                                                         
sleep 0.2s;
done
echo -en "\033[2A"
echo -en "                                                            \n";
echo -en "\033[1A"
echo -en "Enter the empno       : "; read empno1;
1
Nike