【Bash】安全で汎用性のあるtempディレクトリの作成


はじめに

  • 普段shell内で利用する一時ディレクトリ作成において、以下の点で改善点が見受けられた。
    • mkdir /tmp/パスのような直指定のため、場合によって名前の重複が生じる。
    • また直指定のため、セキュリティ的に安全ではない。
    • 名前を一意にして関連性も加えることで、処理内で使いやすく汎用性のあるものにする必要がある。
  • そのため、今回は一意で安全かつ汎用性のあるtmpディレクトリの作成方法を記述する。

結果

  • 先に結果として下記の内容を、用意したシェルファイルに記述する。
index.sh
#!/bin/bash

basepath=$(basename $0)
timestamp=$(date +%Y%m%d%H%M%S)
tmpd=$(mktemp -dt "$basepath.$timestamp.$$")/
echo $tmpd

# 出力
# $TMPDIR/index.sh.20200919152709.XXXX.XXXXX/
  • 記述後、複数回実行して出力したパスへの作成や名前の非重複を確認して、完了。

処理内容

mktempコマンドの利用

  • ディレクトリ作成にmktempコマンドを利用することで、自動でサイズ0のファイルやディレクトリを作成してくれる。
    • mktempの詳細な利用方法はこちらを参考

テンプレートオプションの利用

  • mktempでの作成の際に、このコマンド固有のオプションのt(テンプレート)オプションを利用する。
  • そうすることにより、ディレクトリ名を記述しなくても自動で$TMPDIRに設定されたパス内へ作成してくれる。
    • ※設定されているtmp格納場所を探す際は、echo $TMPDIRで探す
    • ※設定されていない場合、-pで直指定を行うか、/tmpに格納される

名前に関連項目も加える

  • 名前に関連性のあるものを加えておき、プログラムでの処理の際に利用しやすくする。
  • 最低限加えているものは下記。
    • 実行パス名
    • タイムスタンプ(時間)

まとめ

  • 上記のことから、Linuxでは課題を解決するための多数のコマンドが標準で備わっているため、これらを1つでも覚えて組み合わせていくことの重要性を再確認。
  • また、安全面の考慮も必要だが、同時にプログラム内での処理の使いやすさや汎用性への意識の重要性を実感。

参考