やってみる

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

パイプラインでプログラミングする

 今まで適当にやり過ごしていたので少しやってみる。

パイプラインでプログラミングする

 以下のようなことをやってみる。

  1. mkdirで作成するディレクトリ名を引数として受け取りたい
  2. 複数行の入力を受け取りたい
  3. TaskWarriorで複数のタスクを追加する

A. mkdirで作成するディレクトリ名を引数として受け取りたい

 まず、以下がいつもどおり定数にしたもの。

mkdir -p /tmp/some

 パスは固定値(/tmp/some)である。このパスを変数にしたい。

A-1. インライン・スクリプト

 スクリプトのインライン実行が使える。

mkdir -p /tmp/$(date "+%Y%m%d%H%M%S")

 だが、パス作成処理とmkdirが分離できていない。汎用性も考えてパス作成は別処理に分離したい。

A-2. パイプライン

 標準出力された値を利用する。

 xargsを使う。標準出力を参照してサブコマンドを発行する。

echo /tmp/work/$(date "+%Y%m%d%H%M%S")/ | xargs -I@ mkdir -p @

 以下のような構造になっている。

データ生成 | 処理

くりかえす

 今年12ヶ月分のフォルダを作成する。

seq -w 1 12 | xargs -I@ mkdir -p "/tmp/work/$(date "+%Y")/@"
データ生成 |  $(データ加工)処理

 さらに分割するなら以下。

seq -w 1 12 | xargs -I@ echo "/tmp/work/$(date "+%Y")/@" | xargs -I@ mkdir -p @
データ生成 | データ加工 | 処理

 seqは改行コード区切りで数値を出力する。

$ seq -w 1 12
01
02
03
04
05
06
07
08
09
10
11
12

 改行ひとつあたり1コマンド実行される。echoコマンドは12回実行されて以下のように標準出力される。

$ seq -w 1 12 | xargs -I@ echo "/tmp/work/$(date "+%Y")/@"
/tmp/work/2019/01
/tmp/work/2019/02
/tmp/work/2019/03
/tmp/work/2019/04
/tmp/work/2019/05
/tmp/work/2019/06
/tmp/work/2019/07
/tmp/work/2019/08
/tmp/work/2019/09
/tmp/work/2019/10
/tmp/work/2019/11
/tmp/work/2019/12

 改行ひとつあたり1コマンド実行される。よって最後のmkdirコマンドは12回実行されてディレクトリ生成される。

B. 複数行の入力を受け取りたい

 ヒアドキュメントを使う。

$ cat << 'EOS' | xargs -I@ echo /tmp/work/@ | xargs -I@ mkdir -p @
A
B
C
EOS

 スペースを改行に変換する手法。

$ echo "A B C" | tr ' ' '\n' | xargs -I@ echo @
A
B
C
$ echo "A B C" | tr ' ' '\n' | xargs -I@ echo @ | xargs -I@ mkdir -p @

 trの代わりにsedを使う。見づらい……。

$ echo "A B C" | sed 's/ /\n/g' | xargs -I@ echo @ | xargs -I@ mkdir -p @

C. TaskWarriorで複数のタスクを追加する

$ cat << 'EOS' | xargs -I@ task add @
TaskWarriorでタスク分類する方法と手順をブログに書く
TaskWarriorで依存タスクをつくる方法と手順をブログに書く
VIT(TaskWarrior)を使ってみる依存タスクをつくる
Chromiumユーザ選択ランチャー作成する依存タスクをつくる
EOS

 標準出力も複数行で得られた。

Created task 1.
Created task 2.
Created task 3.
Created task 4.

 uuidなど詳細なデータは以下コマンドで出力できる。

$ task {id} export
[
{"id":1,"description":"ローカル辞書のスクリプト修正","entry":"20190219T133145Z","modified":"20190219T133145Z","status":"pending","uuid":"1d32fbb1-3990-45c4-b179-3fbbdfad00f4","urgency":0}
]

参考

前回まで