LoginSignup
3
0

More than 3 years have passed since last update.

シェルスクリプトで名前付きパイプを使い dialog コマンドをパイプラインに組み込む

Last updated at Posted at 2019-06-17

当方執筆の技術情報に関するライセンス、免責事項、禁止事項


概要

今回は mkfifo により作成した名前付きパイプを用いて dialog コマンドとのパイプラインを実現している。

執筆動機

とあるマルチプラットフォームアプリ勝手にPython3.x 化改修及び動作テスト環境として用意した Slackware 14.2。

使ってみると大変魅力的だったので、もっと流行らせるべく初期導入コストを下げるためのスクリプトをノリと勢いで書こうと思い立つ。Salix使えばいいじゃん。

Slackware の流儀に従い、dialog コマンドで TUI によりインプットメソッドの選択や日本語フォントのダウンロードが出来るちょっとしたものを書いているのだが、このコマンドはユーザーの入力を待ち受ける必要からか、 IO 回りが独特に感じられ慣れるのに少し手間取った。

作例

スクリーンショット_2019-06-17_10-33-48.png

上記スクリーンショットのソース


$ 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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0