今まで適当にやり過ごしていたので少しやってみる。
パイプラインでプログラミングする
以下のようなことをやってみる。
mkdir
で作成するディレクトリ名を引数として受け取りたい- 複数行の入力を受け取りたい
- 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} ]
参考
- http://www.koikikukan.com/archives/2015/09/30-022222.php
- Linuxコマンド
- xargs
- https://dakensuk.github.io/2018/08/25/oracle.html