やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ツリーテキストをプログラミング言語で作ったCLIコマンドに渡す方法を考えてみた

 起動引数で渡すと残念なことになる。

前回まで

 そもそも渡したいのはstdinではない。それは手段に過ぎない。\n\tを含むテキストをシェル構文で渡したい。一時ファイルを作らずに。パイプで。最有力候補がstdinだっただけ。

 前回からみるに、起動引数ならできそう。だが、\n\tを含むテキストにはならなそう。

起動引数

 位置引数なら以下。

some-cmd "A\n\tB"

 オプション引数なら以下。

some-cmd --stdin "A\n\tB"

 でもこれ、入力が辛い。本当は以下のように入力・表現したい。

A
    B

ヒアドキュメント

 複数行テキストといえばヒアドキュメントを使えばいいはず。

 だが、以下のようなテキストを端末にコピペするとタブが消えてしまう……。

tree_text="$(cat << EOS
A
  B
EOS
)"
echo -e "$tree_text"

 タブは\tと入力せねばならない……。

tree_text="$(cat << EOS
A
\tB
EOS
)"
echo -e "$tree_text"

起動引数でツリーを表現する方法は?

 このツリー構造をどうやったらshell構文で表現できるか。

  • A
    • A1
      • A11
        • A111
        • A112
      • A12
  • B

 階層を直接指定するなら以下。ただし前から順に処理するため、順序も重要。

tree -1 A -2 A1 -3 A11 -4 A111 -4 A112 -3 A12 -1 B

 以下のようなルールがある。

  • 上から順に処理する

 もし以下のルールも加えたら、階層数は絶対値でなく相対値で書ける。

  • 内部で現在行を保持する

 位置引数はルートに追加するノードである。

 それ以下は子になる。階層方向は相対的に表す。childparentのどちらかで。兄弟が2つ以上あるなら複数の値を渡せばいい。階層差が2つ以上あるなら-c2,p2のように階層差数を付与する。省略時は1

tree A -c A1 -c A11 -c A111 A112 -p A12 -p2 A2 -p B

 ただ、これをみてツリー構造を連想できるだろうか。私には無理。マシンリーダブルであっても人間に読めなければ意味がない。CLIは人間のためのインタフェースなのだから。

所感

 端末(CLI)の限界か?

 そもそも問題が何だったのかブレブレ。XY問題とかいうやつか。私が端末・シェル・プログラミング言語のstdinについて熟知していないせいなのだろう。

 それにしたって、まさか\n,\tを併用したテキストの入力ごときがこれほど難しいとは思わなんだ。CLIってこんなに貧弱なのか。私が知らないだけで方法あるのか?

 なんかすごく頭の悪いことをしている気がする。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux