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

[当方執筆の技術情報に関するライセンス、免責事項、禁止事項](https://qiita.com/EarthSimilarityIndex/items/6b9bb2ccacb38aae15b1)

****

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

# 執筆動機
[とあるマルチプラットフォームアプリ](https://github.com/LibreScanner/horus)の ~~勝手に~~Python3.x 化改修及び動作テスト環境として用意した Slackware 14.2。

使ってみると大変魅力的だったので、もっと流行らせるべく初期導入コストを下げるためのスクリプトを~~ノリと勢いで~~書こうと思い立つ。<font color="#808080">[Salix](https://www.salixos.org/)使えばいいじゃん。</font>

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

# 作例

![スクリーンショット_2019-06-17_10-33-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410379/502532a7-6632-a00b-4156-7af320835284.png)

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

```

$ mkfifo hogepipe
$ cat hogepipe | dialog --ok-label $(cat -) --msgbox "　　　これ で 勝ったと" 5 30 &
$ echo "思うなよぉ！！！" > hogepipe && sleep .1 && %%

```
※1 mkfifoについては[こちら](https://qiita.com/richmikan@github/items/bb660a58690ac01ec295)より引用。
※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
[みんな大好き](https://qiita.com/tags/termux) ルート化不要の Android 向けコマンドライン環境 [Termux](https://termux.com/) でも dialog はインストール可能である。お試しあれ。

また、[宗教上の理由で Google Play を医者に止められている方](https://ja.wikipedia.org/wiki/%E8%81%96%E3%82%A4%E3%82%B0%E3%83%8C%E3%83%81%E3%82%A6%E3%82%B9)は F-Droid からも[インストール可能である](https://f-droid.org/packages/com.termux/)ので安心して欲しい。

# 出典・引用文献
## 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