パイプラインでつなげる。
工程
UNIX体系(CLI)のプログラミングは以下の工程で成り立っている。
- データ生成
- データ加工
- データ抽出
- 処理
ワークフロー
UNIX体系(CLI)のプログラミングは以下のワークフローになる。
$ データ生成 | データ加工 | データ加工 | ... | 処理
なお、同じデータを使って別の処理をしたい場合は以下。
$ データ生成 | データ加工 | データ加工 | ... | 処理A && 処理B && ...
データの一部を使いたい場合は一部を抽出して使う。抽出処理はインラインになる。
$ データ生成 | データ加工 | データ加工 | ... | $(データ抽出)処理A && $(データ抽出)処理B && ...
たとえばディレクトリとファイルを作成する。
$ echo '/tmp/work/$(date +%Y%m%d%H%M%S)/' | xargs -i sh -c 'mkdir -p "{}" && touch "$(dirname {})/$(basename {}).txt"'
以下のような工程である。
データ生成 | 処理A $(データ抽出)処理B
UNIX体系プログラミングの要点
- データ生成用コマンドを使う必要がある
echo
seq
cat << 'EOS'
echo "A B C" | tr ' ' '\n'
date
ls
pwd
which
- データ抽出用コマンドを使う必要がある
- データは標準入出力のみである
- 標準入出力はファイルストリームである
- ファイルストリームは一次元のバイナリ配列である
- データの構造は選べない
- せめてキーバリューで管理できたら楽だったのに
- 普通のプログラミング言語は引数でそれができる
- せめてキーバリューで管理できたら楽だったのに
- 渡せる値はひとつだけ
- データの一部だけ使いたいときはテキスト抽出が必要
cut
tr
sed
grep
head
tail
sort
- データの一部だけ使いたいときはテキスト抽出が必要
- 標準入出力はファイルストリームである
- データは標準入出力のみである
- パイプライン連携には工夫が必要
- 標準入出力の値を使う
xargs
データは標準入出力のみ
引数なし
UNIX体系(CLI)には引数がない。標準出力のみ。そのせいでデータの生成と抽出を処理によって行わねばならない。特に標準出力からテキスト処理によって一部データを抽出する処理が面倒でつまらない。可読性も悪くなる。
もしプログラミング言語ならメソッドの引数を使っていたところである。
グローバル変数なし
UNIX体系(CLI)にはグローバル変数がない。正確にはあるが、パイプライン間における変数の共有ができない。パイプライン間はそれぞれ個別のサブプロセスになるため異なるメモリ空間になる。よって、あるパイプラインで宣言した変数は別のパイプラインでは存在せず参照できない。