端末を色付け とシェル環境には多くの方法があります。 ls
や grep
などの個々のコマンドの出力も色分けできます。 コンソールでメディアを再生する の概念は直接関連していませんが、それにもかかわらず興味深いものですが、これはウィンドウシステムの上のいくつかのフレームワーク(ライブラリ)に依存しているようです。次の質問は、Linuxターミナルフレームワークのbash
シェルとその implementation のみを対象としています。
次のモンタージュを考慮してくださいASCII 2Dのシーンの "レンダリング" game :
これらはランダムに生成されたシーンではありません。私が選択したセグメントはすべて、実際にASCII文字を使用してそのようなオブジェクトを表す)ゲームの「草原」地形(木、低木、低木、花、草など)を表しています。最後のユーザーが作成した4つのシーンのショーケース タイルセット これは基本的にASCII文字の色仕様の文字の再マッピングです(詳細は簡単です-これは視覚的なインスピレーションであると言えば十分ですビジュアルと「パターン」の観点からここで達成しようとしていること)。
モンタージュ共有のこれらのシーンに共通する機能は次のとおりです。
私がVM=に現時点で持っているのはArch Linuxであり、質問はディストリビューション固有ではありませんが、私はそれらを調べました- documentation _/etc/bash.bashrc
_ファイルをカスタマイズするための説明です。多くの説明が Prompt の外観と一般にすべてのフォアグラウンド要素の構成に入ることがわかります。これらの設定や tips などの通常の単色を除く、背景の設定。
_# Background
On_Black='\e[40m' # Black
On_Red='\e[41m' # Red
On_Green='\e[42m' # Green
On_Yellow='\e[43m' # Yellow
On_Blue='\e[44m' # Blue
On_Purple='\e[45m' # Purple
On_Cyan='\e[46m' # Cyan
On_White='\e[47m' # White
_
コンソールを使用するときに入力しなかった空/空白/背景の「スペース」、つまり「何でできているのか」を概念的にはまだ理解していません。いわば。特に、プロンプトにないもの、およびエコーされるコマンドをラップするもの。アクティブラインで発生することに関して、bash
が「ライン指向」の方法で動作し、一部の操作がアクティブラインのクリアをトリガーすることを示すことができます(for i in $(seq 1 $(expr $(tput lines) \* $(tput cols))); do echo -n M; done; tput cup 15 1
次に、プロンプトで文字を入力し、それをバックスペースします-貢献者を実証しました)-その範囲はCLIから別のもの、つまりzshによって異なる場合があります。さらに、_\[\033[44m\]
_のようなものを_bash.bashrc
_のPS1行に追加すると、bashを再ロードした後に青色の背景が表示されます。つまり、somebackgroundに関する限り、ここで出力の外観を活用します。
しかし、bashは、何かを画面に表示するために TTYサブシステム の形式で他の機能に依存しているソフトウェアの一部であることも知っています。これは、そこから VTコンポーネント 私が想定しているカーネル内。 Archの_pstree -Ap
_は、systemd
がlogin
にリンクされ、次にbash
にリンクされていることを示しています。
Arch Linuxディストリビューションは、TTYサービスの agetty
に依存しています。単純な_echo $TERM
_は、使用中の端末のタイプ(ここではDEの外側にある「linux」)を生成し、パラメーターなしの _infocmp[-d spec1 spec2]
_ コマンドは、アクティブな端末機能とプロファイルを示します terminfo(5)端末データベース からの情報:
_# Reconstructed via infocmp from file: /usr/share/terminfo/l/linux
linux|linux console,
am, bce, ccc, eo, mir, msgr, xenl, xon,
colors#8, it#8, ncv#18, pairs#64,
acsc=+\020\,\021-\030.^Y0\333'\004a\261f\370g\361h\260i\316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l\E[?1c,
clear=\E[H\E[J, cnorm=\E[?25h\E[?0c, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
cvvis=\E[?25h\E[?8c, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
el1=\E[1K, flash=\E[?5h\E[?5l$, home=\E[H,
hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@,
il=\E[%p1%dL, il1=\E[L, ind=^J,
initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x,
kb2=\E[G, kbs=\177, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B,
kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[3~, kend=\E[4~, kf1=\E[[A,
kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~,
kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~,
kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kich1=\E[2~,
kmous=\E[M, knp=\E[6~, kpp=\E[5~, kspd=^Z, nel=^M^J, oc=\E]R,
op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, rmacs=\E[10m,
rmam=\E[?7l, rmir=\E[4l, rmpch=\E[10m, rmso=\E[27m,
rmul=\E[24m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm,
setaf=\E[3%p1%dm,
sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m,
sgr0=\E[0;10m, smacs=\E[11m, smam=\E[?7h, smir=\E[4h,
smpch=\E[11m, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?6c, u9=\E[c,
vpa=\E[%i%p1%dd,
_
現状では、ターミナルフレームワークから多くの機能を利用できます。基本的に、PS1変数を設定してプロンプトをカスタマイズする限り、bash.bashrc構成ファイルで公開される機能です。 コントロールとエスケープシーケンス は、基本的には、端末情報データベースに記述されているカーソルの移動やその他の機能などの機能を提供するために、端末に表示される文字の流れを中断するために使用されます。これらの関数の多くは、よく知られている_ESC[
_(または\ 33)を使用して渡されます(= /// =)Control Sequence Introducer(その他のシーケンス here および- ここ 、そしていくつか 例 )。さらに、CLIで tput
ユーティリティを直接使用して、一部の端末プロパティを変更することもできます。たとえば、_tput setab 4
_の場合、青色の背景にbashエコーコマンドが表示されます。
_strace bash
_の場合、エスケープシーケンスと実際の動作の両方を確認できます。
_write(2, "[il@Arch64vm1 ~]$ ", 19[il@Arch64vm1 ~]$ ) = 19 //bash starts
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, " ", 1) = 1 //pressed <space>
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, " ", 1 ) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "\177", 1) = 1 //pressed <backspace>...
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "\10\33[K", ) = 4 //triggers erasing the line
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "\33", 1) = 1 //pressed <esc> per se
_
これは質問のコンテキストを提供します端末の空のスペース/背景色をランダムな(ただしかなりの)セットのASCII文字で置き換えることはできますか?しかし、機能を実装する方法や、ターミナルで何を探しているのかはわかりません。
したがって、これが可能である場合に最終的な結果がどのようになるかを示すための例として、大まかなモックアップを作成しました(真剣ではありません)。
基本的に、ターミナルのすべての「空のスペース」はパターンで埋められます(ここでは、上からの画像の1つを「タイル」しますが、実際の実装では、個々の「空白」のセットからランダムに生成されます指定されるモンタージュから文書化された5〜6文字と特徴)。アクティブなコマンドラインには別のパターンがあります。つまり、波状の「水」ですが、ラインが青であっても問題はありません。これが想像されたように、コマンドはアクティブな行に入力されると「水」を「消去」し、もちろん、文字のパターンがCLIによって解釈されないという制約があり、それ以外の場合は役に立たなくなります。
bash
または適切なターミナルフレームワークで公開されている構成、または一連の文字を使用して色を制御し、ターミナルでbashの出力を変更して、背景のややランダムなパターン(これは上で示したものと似ています)?それとも、完全なパターン画像を ttyの背景 として提供しようとするようなもので解決する必要がありますか?
0.1-PatternOTDバージョン(ログイン時にワンショットディール)
.bashrcファイルに追加した次の式は、調査した概念の一部をまとめたものであり、標準のLinux端末のビジュアルの(非常に)基本的な概念実証を構成します。
_for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[32;32m'$(tr -dc '",.;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 15; tput setab 4; echo -en "\E[2K"; tput setab 0
_
観察
head -c 1
_と_tput cols
_の最初の行を乗算します。これにより、引用された選択から個々のランダムな文字が出力されます。これは遅すぎるためです。 random
は(tput cols)の長い整数を生成するとは思いませんが、それでも高速です。確かにこれはすべて非常に無駄ですが、うまくいきます。0.2-Prompt_COMMANDハックジョブ
変数 Prompt_COMMAND の値は、Bashが各プライマリプロンプトを出力する直前に検査されます。私は通常、変数を使用して、ディスプレイなどから要素を処理できるスクリプトを呼び出すことを知っていますが、.bashrcファイルで直接これを実行しようとしています。最初は、位置認識を実装できると考えました。つまり、実行前のカーソルの場所です(tput
を使用して画面上のどこにでもレンダリングしてから、何かを使用して以前の位置に戻ることができます like this 位置を抽出するには:
_stty -echo; echo -n $'\e[6n'; read -d R x; stty echo; echo ${x#??} //value is in x;x format so...
_
値を_cut -f1 -d";"
_にパイプします。 CLIでこれを行うことはできますが、PS1/P_C変数の要素のシーケンス内でこの作業を行うことは現時点では手の届かない範囲であり、Prompt_COMMANDに入力されたコマンドがすべての改行で評価されない可能性があります。毎回実行されるにもかかわらず、1回だけ(?)(以下の観察を参照)。
したがって、私ができる最善のことは、最初のシーケンスを引き継ぎ、いくつかのコマンドをPrompt_COMMANDと.bashrcのPS1変数の定義の両方に追加することです。そのようです:
_Prompt_COMMAND="echo -en '\E[32;32m'$(tr -dc ',.:~' < /dev/urandom | head -c $(echo "$[$(tput cols) * 2]"))"
PS1="$(echo -en '\n') $(tput setab 4)$(echo -en "\E[2K")$(tput setab 0)\[\033[7;32m\]df:\[\033[1;34m\] \W @d \[\033[0m\]\e[32m"
for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[32;32m'$(tr -dc '",.;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 1; tput setab 4; echo -en "\E[2K"; tput setab 0
_
要約すると、P_Cを使用して永続的な視覚パターンを実装しようとしています。つまり、2行追加されます。残念ながら、「水の」トリックを繰り返している間、つまり両方のパターンを作成することに成功することはできません。つまり、アクティブラインを青にします(これは、背景色を変更し、クリアラインを実行してから、背景を黒に戻します)。これがどのように機能するかを示すために、画像をまとめました。
観察
ls
などのコマンドの側でパターンをラップしていません。bash
によって読み取られます。$(echo -en '\n') $(tput setab 4)
で始まります。$(tput ...)の直前の真ん中のスペースも、これが機能するために必要です。そうしないと、青い線がプロンプトの前ではなく上に表示され、解決できません。そして、このハックは0.2にその名前を与えるものです。 :)0.3-_tput cuu
_&_tput cud
_
_for i in $(seq 1 $(expr $(tput lines))); do echo -en '\E[0;32m'$(tr -dc '",.o;:~' < /dev/urandom | head -c $(tput cols)); done; tput cup 1
Prompt_COMMAND="echo -en '\033[0;32m$(tr -dc ',;o.:~' < /dev/urandom | head -c $(tput cols))\n\033[36;44m$(tr -dc '~' < /dev/urandom | head -c $(tput cols))\033[0;32m$(tr -dc ',.o+;:~' < /dev/urandom | head -c $(tput cols))'$(tput cuu 2)"
PS1="\[\033[0m\] \[\033[1;32m\][1]\[\033[7;32m\]=2=:\W)\[\033[0;32m\]=3=\[\033[1;32m\]=4=@>\[\033[0;32m\]"
_
Prompt_COMMANDで行われるのは、プロンプトが生成される前に3行のパターンが毎回印刷されることです。これらの3セットのパターンは、0.2で説明されている制約内で個別に生成されます。次に、2行上に移動し(_tput cuu 2
_を使用)、プロンプトが中央の行にPS1に従って生成されます。端末にログインしたときに一度だけ実行される.bashrcロードの全画面パターン用の最初のコマンドセットがまだあります。これで、復帰改行がある場合は常に繰り返される独自の青色パターンを持つアクティブな行の周りにいくつかのパディングがあります。 PS1変数とP_Cの内容が無害化されました。長いecho
シーケンス内に埋め込まれたエスケープシーケンスと色分けの構文は注意が必要です。エラーは 奇妙な端末動作 を相互に上書きする行、左マージンから離れて表示されるプロンプト、または意図せずに処理されたものへの異常な出力につながります。私がやっていることに条件があり、私の設定(Arch Bang)でLinuxターミナルとlxtermの視覚的な違いに対抗するためにPS1変数内に余分なスペースが必要です。余計なスペースがないと、Linuxターミナルは、何らかの理由で(当然、私が実行するものであり、デフォルトの動作ではないため)、プロンプトの最初の文字を最終行の終わりに出力します。また、パフォーマンスを向上させるために長い文字列を生成することは早い段階で決定されたため、引用符で囲まれた文字のセットにランダムな効果(太字、逆など)を生成する方法もわかりません。プロンプトの周囲のパディングの外側には、実際のパターンの持続性はまだありませんが、少なくとも水があり、以前よりも単純で、ある程度予測可能です。
端末が開いたときの初期パターン
clear
の後の動作とプロンプトでEnterキーを連続して押す
観察
質問で提供された以前の実装は、tr
と1バイト文字のセットを使用する一連のコマンドに依存しています。この Q&A で説明したように、ユーティリティはUnicodeなどのマルチバイト文字を処理できません。しかし、これらのキャラクターを活用することは、望ましい効果を達成するために非常に重要です。シングルバイトとマルチバイト文字を単一のストリームに混合してレンダリングできる「ソリューション」が提供されました。そこで開発されたソリューションは、ここで提示およびカスタマイズされています。
Z1=$(echo -en '\xe2\x97\x98') #◘ 1
Z2=$(echo -en '\xe2\x95\x9a') #╚ 2
Z3=$(echo -en '\xe2\x95\x9c') #╜ 3
Z4=$(echo -en '\xe2\x95\x9d') #╝ 4
Z5=$(echo -en '\xe2\x95\x9e') #╞ 5
Z6=$(echo -en '\xe2\x95\x9f') #╟ 6
Z7=$(echo -en '\xe2\x96\x91') #░ 7
Z8=$(echo -en '\xe2\x96\x92') #▒ 8
Z9=$(echo -en '\xe2\x96\x93') #▓ 9
N1=$(echo -en '\xe2\x94\x80') #─ a
N2=$(echo -en '\xe2\x95\x92') #╒ b
N3=$(echo -en '\xe2\x95\x97') #╗ c
N4=$(echo -en '\xe2\x96\xb6') #▶d
N5=$(echo -en '\xe2\x94\xbc') #┼ e
N6=$(echo -en '\xe2\x94\xa4') #┤ f
N7=$(echo -en '\xe2\x95\xa1') #╡ g
Z11="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" //Z11 to Z13 not
Z12="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" // used here (see
Z13="$(tr -dc '123456789a' < /dev/urandom | head -c 1)" //link)
echo -en $(tr -dcs ' ;",15bdef' ' ' < /dev/urandom | head -c $(echo -en "$[$(tput cols) * $(tput lines)]") | sed -e "s/1/$(echo -en "\033[0;36m$Z1\033[0m")/g" -e "s/5/$(echo -en "\033[0;32m$Z5\033[0m")/g" -e "s/b/$(echo -en "\033[1;36m$N2\033[0m")/g" -e "s/d/$(echo -en "\033[1;36m$N4\033[0m")/g" -e "s/e/$(echo -en "\033[0;32m$N5\033[1;32m")/g" -e "s/f/$(echo -en "\033[0;36m$N7\033[1;32m")/g"); tput cup 1
^set^+^chars^ to implement from pool - here 1,5,b,d,e,f... so_________________________^add the appropriate sed subprocessing units for implemented chars i.e. first one we replace "1" with the value of $Z1 and apply color at the same time, then all the chars move down the pipe to all required blocks - we selected to implement 6 chars here so we have 6 sed blocks.
[N.B. To remove the blank space from the pattern, remove it from both sets: tr -dcs ';",15bdef' '']
PS1="\[\033[1;36m\] $(echo -en '\xe2\x96\x91')$(echo -en '\xe2\x96\x92')$(echo -en '\xe2\x96\x93')[\t]$(echo -en '\xe2\x96\x93')$(echo -en '\xe2\x96\x92')$(echo -en '\xe2\x96\x91') \[\033[7;36m\]$(echo -en '\xe2\x97\x98')$(echo -en '\xe2\x94\xbc')$(echo -en '\xe2\x94\x80')\W$(echo -en '\xe2\x94\x80')\[\033[0;36m\]$(echo -en '\xe2\x94\x80')$(echo -en '\xe2\x94\x80')$(echo -en '\xe2\x94\x80')@$(echo -en '\xe2\x96\xb6')\[\033[0;36m\]"
Prompt_COMMAND="echo -en '\033[0;36m$(tr -dc '=' < /dev/urandom | head -c $(tput cols))\n\033[01;46m$(tr -dc '~' < /dev/urandom | head -c $(tput cols))\033[0;36m$(tr -dc '=' < /dev/urandom | head -c $(tput cols))'$(tput cuu 2)"
この実装はラインごとにレンダリングするのではなく、sed
処理の最後にシーケンス全体を一度に印刷します。これは、ログイン時に1回だけ表示されるか、一般にbash
が起動されたときに表示されます。起動時のそのようなランダムなパターンの1つを次に示します(緑の2つのシェードとシアンの2つのシェードを確認できます)。
画面は標準のLinuxターミナルで結果を表示し、xtermでも機能します。 PS1プロンプトでこれらの新しいパターン文字の一部を使用しましたが、Prompt_COMMANDはアクティブな行と1バイト文字を使用するその2行のパディングのみを処理します。
このパターンは、.bashrcのarchbey
を呼び出す現在のディストリビューションにも一致します。
クリスマスです!乾杯の人々:)
表示はターミナルによって管理され、Webブラウザーと同じように機能するソフトウェアです。文字シーケンスを解釈して表示を設定します( man terminfo )。 bashシェルは、画面の空の領域を埋める方法を端末に伝えません。
一部の端末では、gtermのように背景として画像を使用できますが、シェルによって作成されません。
それらが可能かどうかは、使用しているハードウェアとソフトウェアに依存します。何にもチューニングされていないときに、アナログTVセットではかなり「無料」のランダムノイズが発生しました。しかし、より重要なのは、「なぜこのようなことをしたいのか」です。
世の中には方法を理解できることがたくさんありますが、それらのサブセットの大部分は、試してみるのが得策ではない、または価値があるよりも多くの問題を引き起こす可能性があるものです。
上記の例で非常に明白な最大の問題は、読みやすさです。背景が塗りつぶされたディスプレイは、解析が難しく、理解に時間がかかり、理解と理解に多くのエラーが発生する可能性があります。要するに、情報チャネルの「背景」を、目下の目的に関係のないある種のノイズで埋める方法を知りたいのです。
これまでの研究の結果を速記の分野の研究と比較することができます。他の画像の背景に情報を埋め込むことは科学です。情報を伝える必要性と情報を同時に隠す必要性のバランスをとる必要があります。
これを積極的に試みていない場合は、開始意図に関係なく、同じ最終結果に近づいている可能性があると考えます。他の人の背景の上に色付きのテキストを印刷して機能する人もいますが、背景から意味を整理するための余分な作業により、作業が遅くなり、創造的な努力の成果が低くなると思います。結局、背景は前景の努力よりも重要になり、あなたと「Where's Waldo」のようなゲームを使い始めます。
これがUnixとLinuxに関連していることは確かにわかりません。おそらく、この質問は、ゲームの作成や速記の交換に適していますか?
信じられないかもしれませんが、これはあなたの質問に対する答えです。おそらくあなたが探していた答えではないかもしれません...