-p は、打鍵を減らすためのオプションではない

同じ手順を何度なぞっても、同じ形に落ち着く
同じ手順を何度なぞっても、同じ形に落ち着く

mkdir -p の -p は、「途中のディレクトリもまとめて作れる」オプションとして知られている。 でも、現場のスクリプトで -p がほぼ必ず付いている理由は、実はもうひとつある。 すでにディレクトリがあっても、エラーにならない。

素の mkdir logs は、2回目の実行で File exists と言って止まる。エラーで打ち切る設定(set -e)のスクリプトなら、そこから先はもう動かない。セットアップスクリプト、Dockerfile、CI のジョブ。どれも同じ処理が何度も走る世界で、-p は1回目と10回目を同じ結果にするための道具になっている。 何度実行しても結果が変わらないこの性質には 冪等性(idempotency) という名前がついていて、Ansible や Terraform のようなインフラ自動化の道具は、まるごとこの考え方の上に立っている。1文字のオプションが、その入り口だ。

ただし -p は文句を言わない。mkdir -p /var/logg/app のような打ち間違いも、黙ってそのとおりに作る。手軽さと引き換えに、「そんな場所は無い」と教えてくれる機能を手放している。

次に -p と打つとき、自分がどちらを買っているのか。階層をまとめて作る手軽さか、もう一度走らせても大丈夫という安心か。