概要
今回は mkfifo により作成した名前付きパイプを用いて dialog コマンドとのパイプラインを実現している。
執筆動機
とあるマルチプラットフォームアプリの 勝手にPython3.x 化改修及び動作テスト環境として用意した Slackware 14.2。
使ってみると大変魅力的だったので、もっと流行らせるべく初期導入コストを下げるためのスクリプトをノリと勢いで書こうと思い立つ。Salix使えばいいじゃん。
Slackware の流儀に従い、dialog コマンドで TUI によりインプットメソッドの選択や日本語フォントのダウンロードが出来るちょっとしたものを書いているのだが、このコマンドはユーザーの入力を待ち受ける必要からか、 IO 回りが独特に感じられ慣れるのに少し手間取った。
作例
上記スクリーンショットのソース
$ mkfifo hogepipe
$ cat hogepipe | dialog --ok-label $(cat -) --msgbox " これ で 勝ったと" 5 30 &
$ echo "思うなよぉ!!!" > hogepipe && sleep .1 && %%
※1 mkfifoについてはこちらより引用。
※2 上記コマンドでは「OK」ボタンのラベルを上書きしているが、文章の出力先はタイトルでも本文でも良い。
留意すべき仕様
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error, but there are options for changing
this: "--output-fd", "--stderr" and "--stdout". No text is written if
the Cancel button (or ESC) is pressed; dialog exits immediately in that
case.
とのこと。これは参考文献に記載した whiptail コマンドでも同様らしい。
なお、通常のUNIXコマンドを扱う時のように> hoge
とファイルにリダイレクトすると以下のようなエスケープシーケンス列を得る。※ このようにリダイレクトした場合、画面は表示されないがキーボード入力は受け付ける。
dialog --ok-label "思うなよぉ!!!" --msgbox " これ で 勝ったと" 5 30 > hoge
テキストエディタで開くと以下の内容だった。
[?1049h[1;24r(B[m[4l[?7h[?1h=[?1000h[39;49m[?1h=[39;49m(B[m[H[2J[16d[37m[44m[J[H[K
[K
[K
[K
[K
[K
[K
[K
[K[10;24H[1K (0[0;1m[36m[46mlqqqqqqqqqqqqqqqqqqqqqqqqqqqq(0[0m[30m[46mk(B[0m[37m[44m[K[11;24H[1K (0[0;1m[36m[46mx(B[0m[30m[46m[28X[11;54H(0[0m[30m[46mx(B[0m[37m[40m [37m[44m[K[12;24H[1K (0[0;1m[36m[46mtqqqqqqqqqqqqqqqqqqqqqqqqqqqq(0[0m[30m[46mu(B[0m[37m[40m [37m[44m[K[13;24H[1K (0[0;1m[36m[46mx(B[0m[30m[46m (B[0;1m[37m[44m<思うなよぉ!!!>(B[0m[30m[46m (0[0m[30m[46mx(B[0m[37m[40m [37m[44m[K[14;24H[1K (0[0;1m[36m[46mm(0[0m[30m[46mqqqqqqqqqqqqqqqqqqqqqqqqqqqqj(B[0m[37m[40m [37m[44m[K[15;26H[1K [37m[40m[30X[15;57H[37m[44m[K[13;32H[39;49m(B[m[11;27H[30m[46m これ で 勝ったと[13;32H[39;49m(B[m[15;56H[?1000l[24;1H[?1049l
[?1l>
おまけ
エスケープシーケンスによる画像描画ライブラリとして libsixel がある。ffmpeg-sixel によって端末上で動画を再生することも可能であるそうだ。
おまけのおまけ:Termux
みんな大好き ルート化不要の Android 向けコマンドライン環境 Termux でも dialog はインストール可能である。お試しあれ。
また、宗教上の理由で Google Play を医者に止められている方は F-Droid からもインストール可能であるので安心して欲しい。
出典・引用文献
mkfifoコマンドについて
@richmikan@github氏
mkfifoコマンドって使ってますか?
https://qiita.com/richmikan@github/items/bb660a58690ac01ec295
dialog コマンドについて
公式サイト
https://invisible-island.net/dialog/
man ページ及びソースコード付属のサンプルコード
dialog(1) manpage of dialog
https://invisible-island.net/dialog/manpage/dialog.html
ソースコード
展開されたディレクトリのうち、samples/ 以下に豊富に作例が存在
https://invisible-island.net/dialog/#download
参考文献
whiptail コマンドによる TUI のレシピ
柴田充也氏
第422回 whiptailでCUIをグラフィカルにする:Ubuntu Weekly Recipe|gihyo.jp 技術評論社
http://gihyo.jp/admin/serial/01/ubuntu-recipe/0422
※ 本項執筆にあたり、文章表現におけるユーモアを丸パクリ……げふん、オマージュしました。
blacknon氏
UbuntuやCentOSに入ってるwhiptailでTUIっぽいスクリプトを作成する(+注意点とか) | 俺的備忘録 〜なんかいろいろ〜
https://orebibou.com/2018/01/ubuntu%E3%82%84centos%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%A6%E3%82%8Bwhiptail%E3%81%A7tui%E3%81%A3%E3%81%BD%E3%81%84%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99/
※ うっほほい
TUI
テキストユーザインタフェース - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9
Text-based user interface - Wikipedia
https://en.wikipedia.org/wiki/Text-based_user_interface
sixel
@arakiken氏
libsixelによるSixel Graphicsへの変換処理について
https://qiita.com/arakiken/items/4a216af6547d2574d283
libsixel
https://github.com/saitoha/libsixel
FFmpeg-SIXEL
https://github.com/saitoha/FFmpeg-SIXEL